Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 过滤每个union表select中的行或仅在父select上过滤一次是否更有效_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 过滤每个union表select中的行或仅在父select上过滤一次是否更有效

Sql 过滤每个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

我试图理解以下两个存储过程之间的性能逻辑。假设我有一个存储过程,它基于一个名为@user的变量对三个不同表中的行进行计数。最好在每个表选择上过滤输出,还是在“父”选择上只过滤一次

存储过程1

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所展示的。很有趣,您可以共享查询和计划的打印屏幕吗?