对SQL SERVER查询的轻微更改会导致执行时间极慢

时间:2015-05-29 23:59:01

标签: sql sql-server

我不明白这两个查询在功能上有什么不同会使它们如此不同。首先是我的初步查询:

{{1}}

这需要13分6秒才能执行。因为我习惯了这样的简单查询需要几秒钟而不是几分钟我玩了并且做了这个查询,这至少在我看来是等价的:

{{1}}

不同之处在于此查询执行时间为2秒,而上述时间为13分钟。怎么回事?

1 个答案:

答案 0 :(得分:1)

在这两种情况下,您都使用&#34;相关子查询&#34;,它会对XSales_Code中传递Status = 1 AND Last_Mdt < '2014-01-01'条件的每一行执行。

这样想:XSales_CodeStatus = 1 AND Last_Mdt < '2014-01-01'过滤,然后SQL Server扫描此中间结果的每一行,并且对于每一行,它执行SELECT DISTINCT SCode FROM XTransactions_01...查询以查看如果要包含该行。

您的第二个查询执行相关子查询的次数相同,但速度更快,因为它针对较小的表执行。

通常,执行NOT IN查询的最快方法是将联接保留为&#34;而不是&#34;子查询,然后省略左连接列为空的任何行。这摆脱了相关的子查询。

SELECT * FROM XSales_Code SC
LEFT JOIN (
    SELECT DISTINCT SCode FROM XTransactions_01
    WHERE Last_Mdt > '2012-01-01'
        AND SCode IS NOT NULL
) whatevs ON SC.SCode = whatevs.SCode
WHERE SC.Status = 1
  AND SC.Last_Mdt < '2014-01-01'
  AND whatevs.SCode IS NULL
ORDER BY Last_Mdt desc

这很难解释,但尝试在没有倒数第二行(AND whatevs.SCode IS NULL)的情况下运行上面的查询,并且当条件为whatevs.SCODE时,您将看到IN如何具有值&#34; IN&#34;当条件为&#34; NOT IN&#34;。

时为null

最后,我想强调相关的子查询本质上不是邪恶的。通常它们适用于NOT IN条件和许多其他用例,但对于$.ajax({ type: "POST", url: '<?php echo base_url();?>index.php/profile/add_jobs', datatype: "json", traditional: true, data: {json:JSON.stringify(all_publication)}, success: function (response) { console.log(response); $('.all').html(''); }});return false; //disable refresh 条件,它们往往很慢。