1

我有一个存储过程,它运行一个带有巨大 where 子句的查询。WHERE 子句本身非常简单。看起来像

SELECT a, b, c FROM table
WHERE (cond1) OR (cond2) OR (cond3) OR (cond4)

其中 cond1、cond2、cond3 和 cond4 都代表我们用户的一些要求。

我的问题是关于查询性能的:执行 4 个单独的查询(每个都有条件 cond{1..4} 之一),将结果插入临时表,然后最终从该临时表中选择所有内容是否有意义?

我想知道的是,dbms 是否针对这种情况进行了优化。

FWIW,我正在使用 Syabse ASE - TDS 5.5。

谢谢哈沙斯

PS:请不要让我“做我自己的基准测试”。我当然会最终这样做。我真正在寻找指向此类优化内部的链接(如果有的话)。泰:)

4

3 回答 3

2

如果您将所有内容都包含在单个 WHERE 子句中,那么至少 DBMS 将有机会对其进行优化。如果您使用单独的查询,那么 DBMS 将无法优化。

此外,在我看来,您正在为临时表、多个查询以及将所有内容组合在一起增加一堆开销。我无法想象你的第二个选择怎么会更快甚至一样快。

于 2011-01-17T07:04:14.040 回答
2

拥有更大的 WHERE 几乎总是比将其分成多个查询然后附加结果要快。

考虑到在多个查询中,您正在为每个查询扫描表 - 这会增加相当大的开销,更不用说可能发生的任何类型的磁盘 IO。最好在内存中有数据时比较您需要比较的所有内容,而不是冒着将其从内存中丢失的风险,只需要将其拉回内存中以进行下一次查询。

于 2011-01-17T07:05:27.783 回答
2

拆分查询可以更快的原因是较小的单独查询可以使用索引来解决,其中大查询会导致表扫描。

第一个问题是:表有索引吗?如果不是,则始终需要进行表扫描,将查询分成 N 部分只会导致 N 次表扫描。

如果有索引,您必须测试优化器是否决定使用它们。如果查询优化器已经使用它们,那么拆分查询就没有意义了。

If there are indexes, and the query optimizer does not use them, and your testing shows that it would be faster to use them, you can benefit from splitting the query.

于 2011-01-17T07:10:31.643 回答