Sql 过滤每个union表select中的行或仅在父select上过滤一次是否更有效
我试图理解以下两个存储过程之间的性能逻辑。假设我有一个存储过程,它基于一个名为@user的变量对三个不同表中的行进行计数。最好在每个表选择上过滤输出,还是在“父”选择上只过滤一次 存储过程1Sql 过滤每个union表select中的行或仅在父select上过滤一次是否更有效,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我试图理解以下两个存储过程之间的性能逻辑。假设我有一个存储过程,它基于一个名为@user的变量对三个不同表中的行进行计数。最好在每个表选择上过滤输出,还是在“父”选择上只过滤一次 存储过程1 CREATE PROCEDURE [dbo].[myProcedure1] @user NVARCHAR(150), @postCount int out AS BEGIN SELECT @postCount = COUNT(unionPostCount.IDpost) FROM
CREATE PROCEDURE [dbo].[myProcedure1]
@user NVARCHAR(150),
@postCount int out
AS
BEGIN
SELECT @postCount = COUNT(unionPostCount.IDpost)
FROM (
SELECT IDpost FROM Table1 WHERE Table1.IDuser = @user
UNION ALL SELECT IDpost FROM Table2 WHERE Table2.IDuser = @user
UNION ALL SELECT IDpost Table3 WHERE Table3.IDuser = @user
)
AS unionPostCount
END
存储过程2
CREATE PROCEDURE [dbo].[myProcedure2]
@user NVARCHAR(150),
@postCount int out
AS
BEGIN
SELECT @postCount = COUNT(unionPostCount.IDpost)
FROM (
SELECT IDpost FROM Table1
UNION ALL SELECT IDpost FROM Table2
UNION ALL SELECT IDpost Table3
)
AS unionPostCount WHERE unionPostCount.IDuser = @user
END
我有一种感觉,对于非常大的表,过程2会比较慢,因为它必须从三个表中选择所有行,然后过滤它们,但我可能错了。这两个过程中哪一个性能更快?所有的帮助都得到了很好的回报。我改变了答案,因为维克多确实是对的。计划是一样的
我仍然认为,3计数操作应该更快,这取决于检索到的数据的大小,但花费的时间最多的是在所有解决方案中查找行。因此,我想所有的解决方案在性能方面都很接近。我想他们将有相同的执行计划。只需确保在IDuser上为所有涉及的表建立索引即可。
为加快解决方案计数速度,请分别选择并添加结果。内部优化器不单独计数联合。 两个计划都是平等的。
例如和您的IDuser字段有索引吗?什么是“我有感觉”?只需测量一下:-)对于你的问题:我假设,最大的性能交易将是一个关于IDUser的索引。在这种情况下,任何计数都应该非常快。。。还有一点(谈到性能):我从来不会使用SP来实现这一点,而是使用UDF。从安全编码的角度来看,第一步应该是正确的。但是,在这种情况下,由于存在支持索引,优化器可能会选择优化第二个查询,并“重写”它以作为第一个查询运行。这种情况非常类似于从视图进行查询,如果有支持索引,优化器将分别对每个表应用筛选器。您忘记了,内部优化器不会单独计算联合数。两个计划都是平等的。例如,实际上,这些计划是不平等的。在查询中输入计数,您将看到计划是如何变化的。没什么区别是的。。我在小提琴上看到。。我能说什么呢?我可以在我的机器上向您展示两种不同的计划,都是2008/2014年。这两个计划都不同于fiddle所展示的。很有趣,您可以共享查询和计划的打印屏幕吗?