2

我正在测试一个 Ingres Vectorwise 数据库,试图找到一种更快的方法来运行查询,因为我们在文本查找方面遇到了一些缓慢。

如果我基于 char() 列查找大约 5000 个项目,则下面的实现 #1 非常快。不幸的是,查找 50 项所需的时间与查找 5000 项所需的时间大致相同。

另一方面,实现#2 对于 50 个项目非常快,但对于 5000 个项目根本无法扩展。

实施#3 显然会比#1 更糟糕,但我只是提供了我尝试过的示例。

我的问题是:假设我的表只有两列,q = bigint, r = char() 字段,你能想到任何其他方法来使用基本 SQL 编写这个查询,以便我可以有更多的选择吗?我希望有一个选项可以合理地执行 50 和 5000(可以像您在数据库中所期望的那样扩展)。

请注意,我将接受执行相同功能的替代查询的任何答案;越多越好。我不希望任何人会以我希望的方式扩展,但我不会知道,直到我尝试更多。


实施#1:

select q
from test_table
where r in ('a', 'b', 'c', 'd', 'e')

实施#2:

select q
from test_table
where r = 'a' or r = 'b' or r = 'c' or r ='d' or r = 'e'

实施#3:

select q
from test_table a
where exists (
    select r
    from testtable
    where r in ('a', 'b', 'c', 'd', 'e')
    and a.r = r)
4

2 回答 2

2

Vectorwise 不会“像您期望的那样扩展”,因为它没有 B 树索引。它使用每个块的高值和低值元数据来选择要读取的块,就像大多数柱状分析 DBMS 一样。这在从一个非常大的表中拉出许多行时提供了出色的性能,但在拉出几行时性能很差,因为它会遍历许多不需要的行。

您可以通过手动或使用“创建索引”命令在“r”上对表进行排序来优化(这将防止在第一次加载后进行批量加载)。这将使元数据更精确,因此将读取更少的块。

我注意到示例中只有两列,没有连接,也没有聚合函数。列式数据库真的是您需要的还是 Lucene 更合适?

于 2013-03-01T16:05:59.767 回答
1

我只能在实施#2 中建议一个联合/联合,因为联合可能比 OR 更快。实施#1是我更喜欢的。它应该使用索引并且应该足够快。例如,从 Oracle 10g 开始,它将自动重写 IN 子查询以使用 EXISTS。

select q
from test_table
where r = 'a' 
UNION ALL
select q
from test_table
where r = 'b' 
....

UNION 运算符选择不同的行。UNION ALL 选择包括重复项在内的所有行。UNION ALL 通常比 UNION 快。

于 2013-03-01T15:28:36.147 回答