Tsql 帮助选择最佳查询形式的T-SQL查询计划?

Tsql 帮助选择最佳查询形式的T-SQL查询计划?,tsql,sql-execution-plan,Tsql,Sql Execution Plan,我有一个简单的数据记录表,其中有两个数据列a和B,我想为它们生成a+B之和。但是a和B中的一个或两个可以为空。该表还有一个timestamp列,它是主键 我可以找到几种方法来剥这只猫的皮,但我很想知道,在一系列时间戳上求和数据的首选方法是什么: 1. SUM(Coalesce(A,0)+Coalesce(B,0)) 2. SUM(Coalesce(A+B,A,B,0)) 3. Coalesce( Sum(A), 0) + Coalesce( SUM(B), 0) 我从Execution p

我有一个简单的数据记录表,其中有两个数据列a和B,我想为它们生成a+B之和。但是a和B中的一个或两个可以为空。该表还有一个timestamp列,它是主键

我可以找到几种方法来剥这只猫的皮,但我很想知道,在一系列时间戳上求和数据的首选方法是什么:

1. SUM(Coalesce(A,0)+Coalesce(B,0))

2. SUM(Coalesce(A+B,A,B,0))

3. Coalesce( Sum(A), 0) + Coalesce( SUM(B), 0)
我从Execution planner获得以下结果:

Form Select Compute Scalar Stream Aggregate Compute Scaler Clustered Index Seek 1 0% 0% 11% 1% 87% 2 0% 0% 11% 1% 87% Form Select Compute Scalar Compute Scaler Stream Aggregate Clustered Index Seek 3 0% 0% 0% 12% 88% 表单选择计算标量流聚合计算标量器聚集索引搜索 1 0% 0% 11% 1% 87% 2 0% 0% 11% 1% 87% 表单选择计算标量计算定标器流聚合聚集索引搜索 3 0% 0% 0% 12% 88%
我以前从未深入研究过查询计划,所以我不知道如何解释这些数字。公平地说,总的来说,偏向右边的比例越大,情况就越好?使表格3优于1和2?

针对预期情况进行优化


在这里,如果A和B在大多数时候都有值,那么#2应该做得更好,因为合并将达到第一个值并停止。如果A或B经常为NULL,那么使用#1可能会更好一些。与往常一样,这里的关键是尝试并分析实际数据的实际时间。

好的,我可以理解,但是如果查询计划结果是在相同的数据上运行的,那么它们会告诉我什么?这些是在实际开始运行查询之前由查询引擎生成的预期计划。它们告诉您sql server将如何执行查询,但不考虑实际时间。您需要查看实际执行时间。在一个安静的服务器上执行,并多次执行以获得平均值。@Joel。。所以基本上你是在告诉我,查看这个执行计划并不是很有用,唯一真正有意义的决定是通过在安静的服务器上对真实世界的数据运行查询来获得的?这对我来说确实有点不诚实。执行计划可以帮助您发现明显的瓶颈:表查找等。当两个计划不同时,它们可以帮助你区分它们。但当两个查询生成类似的计划时,您需要分析实际时间。