我注意到以下命令在 SQL Server (2008 R2) 中运行需要 32 秒
IF ((SELECT COUNT(*) FROM view1) != 0)
OR ((SELECT COUNT(*) FROM view2) != 0)
OR ((SELECT COUNT(*) FROM view3) != 0)
OR ((SELECT COUNT(*) FROM view4) != 0)
OR ((SELECT COUNT(*) FROM view5) != 0)
OR ((SELECT COUNT(*) FROM view6) != 0)
PRINT 'HI'
然而,下面的内容只花了4秒
SELECT
(SELECT COUNT(*) FROM view1)
, (SELECT COUNT(*) FROM view2)
, (SELECT COUNT(*) FROM view3)
, (SELECT COUNT(*) FROM view4)
, (SELECT COUNT(*) FROM view5)
, (SELECT COUNT(*) FROM viwe6)
我已经通过执行 SELECT COUNT(1)... + SELECT... != 0 设法优化了条件,这样需要 4 秒,但查看执行计划并没有产生任何特别值得注意的结果。没有太多机会在谷歌上搜索“OR”这个词。
有人可以分享一下 SQL Server 优化器可能在背后做什么吗?
编辑:IF EXISTS 尝试花费了 38 秒。
IF EXISTS ((SELECT 1 FROM view1)
UNION (SELECT 1 FROM view2)
UNION (SELECT 1 FROM view3)
UNION (SELECT 1 FROM view4)
UNION (SELECT 1 FROM view5)
UNION (SELECT 1 FROM view6))
PRINT 'HI'
EDIT2:当前的 5 秒方法。
IF (SELECT COUNT(1) FROM view1)
+ (SELECT COUNT(1) FROM view2)
+ (SELECT COUNT(1) FROM view3)
+ (SELECT COUNT(1) FROM view4)
+ (SELECT COUNT(1) FROM view5)
+ (SELECT COUNT(1) FROM viwe6) != 0
PRINT 'HI'
EDIT3:比较 20 页大小的查询计划后 - 看起来加速主要是由于底层 View 在连接之前执行部分聚合,而不是先执行连接然后聚合。
最佳答案
使用 TOP 1 语句:
例如:
DECLARE @CONTROL INT;
WITH CTE AS (
SELECT TOP 1 col FROM view1
UNION ALL
SELECT TOP 1 col FROM view2
UNION ALL
SELECT TOP 1 col FROM view3
UNION ALL
SELECT TOP 1 col FROM view4
UNION ALL
SELECT TOP 1 col FROM view5
UNION ALL
SELECT TOP 1 col FROM view6)
SELECT @CONTROL = COUNT(col) FROM CTE
IF @CONTROL != 0
PRINT 'HI'
关于sql - 条件 IF 中的查询速度变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27116613/