sql - 条件 IF 中的查询速度变慢

标签 sql sql-server t-sql query-optimization

我注意到以下命令在 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/

相关文章:

mysql - 在 mysql 中向 CURRENT_TIMESTAMP 添加 6 个月

sql - PostgreSQL 如何创建数据库或模式的副本?

sql - SQL Server中的“尝试/捕获” block 不处理错误

c# - 如何在 View 模型中存储 linq 查询结果

sql - 如何在 where 子句中获取多个条件

sql-server - 在 T-SQL 中创建新索引时需要重新索引吗?

mysql - 如何在sql中将两行中的某些属性合并为一行?

SQL 查询删除彼此相隔 3000 毫秒内发生的记录

sql - 如果数字为 0.00,如何显示文本值 'X'。 SQL Server、存储过程

sql - 递归 CTE 错误 : Types do not match