sql - 在每个联合表选择中过滤行还是只在父选择上过滤一次更有效

标签 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 (
       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 个计数操作应该更快,具体取决于检索到的数据的大小,认为花费最多的时间是在所有解决方案中查找行。所以我想所有解决方案在性能方面都很接近。

关于sql - 在每个联合表选择中过滤行还是只在父选择上过滤一次更有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112902/

相关文章:

asp.net - 在ASP.net中显示SQL错误

c# - 需要 SQL 帮助复制行

mysql - SQL 选择外连接和分组依据和 ISNULL ( COUNT ) HELP =x

sql-server - 无法将数据库从 SQL Server 迁移到 Azure SQL

php - MySQL PhP 从第 1 列复制并插入到第 2 列,但保留两个值

stored-procedures - IBM Worklight - 是否可以使用 Out 参数调用存储过程?

phpMyAdmin:如何安排我的存储过程?

MYSQL存储过程select语句select不正确的ID

sql - 模拟 mysql 服务器以在其上运行 sql 命令进行练习

sql - 在 WHERE 子句中使用带有 LIKE 的参数化 SQL(Pervasive SQL)