【问题标题】:SQL stored proc performance - huge WHERE clauseSQL 存储过程性能 - 巨大的 WHERE 子句
【发布时间】:2011-01-17 06:59:28
【问题描述】:

我有一个存储过程,它运行一个带有巨大 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:请不要让我“做我自己的基准测试”。我当然会最终这样做。我真正在寻找指向此类优化内部的链接(如果有的话)。泰:)

【问题讨论】:

  • “你的onw 标记”甚至不是第一件事。查看执行计划,尝试了解正在发生的事情,并考虑是否有更好的方法来做到这一点。您已请求资源,因此:Use-The-Index-Luke.com
  • 感谢所有答案:)

标签: sql sap-ase


【解决方案1】:

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

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

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

如果有索引,而查询优化器不使用它们,并且您的测试表明使用它们会更快,那么您可以从拆分查询中受益。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2014-01-24
        • 1970-01-01
        • 2017-02-26
        • 1970-01-01
        • 2011-02-08
        • 1970-01-01
        • 1970-01-01
        • 2015-11-21
        • 1970-01-01
        相关资源
        最近更新 更多