【问题标题】:SQL Server plan caching on very similar but different queriesSQL Server 计划缓存非常相似但不同的查询
【发布时间】:2014-12-11 13:11:04
【问题描述】:

假设我有这样的查询:

SELECT COUNT(*) FROM Investors
WHERE 1=1  
AND 
(
    investerName IN (SELECT investerName FROM Assets WHERE Assets.CompanyID=Investors.CompanyID AND Assets.CompanyID = @companyID )
    OR investerName IN 
        (
            SELECT investerName FROM InvestmentEnrollments WHERE InvestmentEnrollments .CompanyID=Investors.CompanyIDAND InvestmentEnrollments .state IN (3,4) AND InvestmentEnrollments.CompanyID = @companyID         
        )
) 
AND Investors.CompanyID=@companyID

还有另一个类似的查询:

SELECT COUNT(*) FROM Investors
WHERE 1=1  
AND 
(
    investerName IN (SELECT investerName FROM Assets WHERE Assets.CompanyID=Investors.companyID AND Assets.companyID = @companyID )
    OR investerName IN 
        (
            SELECT investerName FROM InvestmentEnrollments WHERE InvestmentEnrollments .companyID=Investors.companyID AND InvestmentEnrollments.state IN (3,4) AND InvestmentEnrollments.companyID = @companyID         
        )
) 
AND Investors.companyID=@companyID
AND Investors.userName = @someInvestorUserName

两个查询都很相似,但第二个查询有额外的 where 谓词。那么在这种情况下 SQL Server 会做什么呢?它是否尝试将两者都放入同一个查询计划中?或者这些被认为是需要不同查询计划的两个不同查询?

【问题讨论】:

  • 为什么不自己测试呢?打开“包括实际执行计划”并进行比较。
  • @TimofeyGMorozov 比较两个执行计划并不能说明是相同的执行计划,执行了两次,还是碰巧包含完全相同的运算符和相同参数的两个不同的执行计划。您需要查看正在执行的sys.dm_exec_requests.sql_plan_handle
  • 为@TimofeyGMorozov 的回答辩护,这些计划看起来有点不同,所以人们可能会猜测这些是不同的计划。

标签: sql-server query-optimization query-cache


【解决方案1】:

查询不仅是不同的文本,而且在语义上也不同。这些是不同的查询,需要不同的执行计划。没有共同点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-27
    相关资源
    最近更新 更多