SQL存储过程性能 - 巨大的WHERE子句

时间:2011-01-17 06:59:29

标签: sql sybase-ase

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

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

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

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

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

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

由于 Harshath

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

3 个答案:

答案 0 :(得分:2)

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

此外,在我看来,你正在为临时表添加一堆开销,多个查询,并将所有内容组合在一起。我无法想象你的第二种选择如何更快或甚至更快。

答案 1 :(得分:2)

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

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

答案 2 :(得分:2)

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

第一个问题是:表格是否有索引?如果没有,则始终需要进行表扫描,将查询拆分为N个部分只会导致N个表扫描。

如果有索引,则必须测试优化程序是否决定使用它们。如果查询优化器已经使用它们,则分割查询没有意义。

如果存在索引,并且查询优化器不使用它们,并且您的测试显示使用它们会更快,则可以从拆分查询中受益。