1
select * from big_table 
        where big_table_column1 > (select max(another_table_column1) from another_table) 
        and   big_table_column1 < 100000000

如果 max(another_table_column1) 返回 200000000,那么应该没有要检索的行。

然后在SQL server 2008 R2 企业版上执行时,需要很长时间,似乎是从big_table 中检索数据。

但是在 Oracle 上执行它时,它马上就完成了。

似乎 SQL 服务器不会根据子查询的结果动态地进行优化,对吗?

谢谢。

4

1 回答 1

1

不,它不会在评估子查询后动态检测到这种矛盾。如果big_table_column1被索引并且计划显示范围搜索,那么它不会有太大的区别,但如果不是,你可以通过分解查询和使用来优化事情OPTION (RECOMPILE)

组合查询对大表进行全面扫描。

在此处输入图像描述

一分为二让它根本不接触大表(不断扫描表明在重新编译语句时检测到了矛盾)

在此处输入图像描述

CREATE TABLE big_table
  (
     big_table_column1 INT
  )

INSERT INTO big_table
SELECT TOP 1000000 v1.number
FROM   master..spt_values v1,
       master..spt_values v2

CREATE TABLE another_table
  (
     another_table_column1 INT
  )

INSERT INTO another_table
VALUES      (200000000)

/*Query 1*/
SELECT *
FROM   big_table
WHERE  big_table_column1 > (SELECT MAX(another_table_column1)
                            FROM   another_table)
       AND big_table_column1 < 100000000
OPTION (RECOMPILE)

/*Query 2*/
DECLARE @another_table_column1 INT

SELECT @another_table_column1 = MAX(another_table_column1)
FROM   another_table

SELECT *
FROM   big_table
WHERE  big_table_column1 > @another_table_column1
       AND big_table_column1 < 100000000
OPTION (RECOMPILE)

DROP TABLE big_table, another_table 
于 2013-05-03T14:34:56.097 回答