“With”命令比使用临时表慢 Select * into #table1 from

约翰尼·贝兹爵士

为什么以下查询要快得多?

查询 1:

    select distinct ID mid
INTO #t1
from A_Position a where a.situationdate=@SituationDate and 
    a.Portfolio_Name=@portfolio and a.Purpose=@purpose and ID!='TOTAL'

select distinct ID gid 
INTO #t2
from B_Position a where a.situationdate=@SituationDate and 
    a.Purpose=@purpose

select @check=COUNT(mid) from #t1 A INNER JOIN #t2 B ON A.mid = 
    B.gid

查询 1 比查询 2 快得多。

查询 2:

;With 
A as (
select distinct ID mid 
    from A_Position a where 
    a.situationdate=@SituationDate and a.Portfolio_Name=@portfolio and 
    a.Purpose=@purpose and ID!='TOTAL'), 

    B as(
select distinct ID gid 
    from B_Position a where 
    a.situationdate=@SituationDate and a.Purpose=@purpose)

select @check=COUNT(mid) from A INNER JOIN B ON A.mid = 
    B.gid

查询 3:

select @check=COUNT(*)  
        from (
    select distinct ID mid 
        from A_Position a where a.situationdate=@SituationDate and 
        a.Portfolio_Name=@portfolio and a.Purpose=@purpose and 
        ID!='TOTAL') A
    inner join (  select distinct ID gid 
        from B_Position a where 
        a.situationdate=@SituationDate and a.Purpose=@purpose) B on mid=gid

基本上,所有三个查询都有相同的结果,但查询 1 只需要 1-2 秒来执行。另一方面,查询 2 或 3 的执行时间超过 10 分钟。为什么代码的编写方式会有如此巨大的差异?(为什么“With”变慢了)

戈登·利诺夫

这是一个优化问题。如果您查看执行计划,您就会明白为什么其中一个计划比其他计划快得多。

首先,后两者是相同的。将子查询表示为 CTE 或子查询不会更改 SQL Server 中的执行计划。

为什么临时表版本更快?简单的答案是它获得了更好的执行计划。

但这引出了一个问题。原因是因为用于连接两个表的算法。在 CTE/子查询版本中,SQL Server 必须猜测生成了多少行。根据这个数字,它选择它认为最好的算法。

在临时表版本中,数据已经在一个表中,所以 SQL Server 不需要猜测。

因此,临时表可以产生更好的执行计划。不过,让我警告一些事情。使用临时表有更多的开销——数据实际上需要存储在某个地方。它还限制了优化的可能性(在这种情况下恰好是好的,但在其他情况下可能不是)。

您应该能够添加提示以加速其他版本。我猜想像OPTION (HASH JOIN).

您还可以设置索引来优化所有三个版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用批处理插入时如何识别错误行(INSERT INTO table2 SELECT * FROM table1)

来自分类Dev

使用批处理插入时如何识别错误行(INSERT INTO table2 SELECT * FROM table1)

来自分类Dev

MySQL SELECT * FROM table1,table2,table3

来自分类Dev

Select ONE random row from Table1 where id does not exist in Table2

来自分类Dev

如何从“ TABLE1 AND TABLE2”创建SELECT查询

来自分类Dev

mysql union select where table1 field3 = table2 field5

来自分类Dev

SQL Server matching all rows from Table1 with all rows from Table2

来自分类Dev

SELECT * FROM table_1 WHERE ID =表_2中的ID

来自分类Dev

SELECT * FROM table_1 WHERE ID =表_2中的ID

来自分类Dev

如何使用与table1不相关的子句正确计算table2中与table1中的项目相关的行

来自分类Dev

如何使用 TABLE2 中的值更新 TABLE1 而不将 TABLE1 中的列设置为特定的单个选择语句?

来自分类Dev

SELECT FROM table,ORDER BY IF(...)

来自分类Dev

使用准备好的语句根据 table1 计算 table2 上的行

来自分类Dev

如何通过MYSQL上的数据透视表从table1中选择随机行

来自分类Dev

如何将table1包输出表保存为.doc格式?[R

来自分类Dev

PHP Union-仅在表名称= table1时显示数据

来自分类Dev

如何通过MYSQL上的数据透视表从table1中选择随机行

来自分类Dev

MySQL table1和table2如果不存在于表1中显示

来自分类Dev

使用缩写代码在 R 中使用 table1 指定自定义渲染器

来自分类Dev

使用table1创建汇总表时出错:“ ExtractVars中的模型公式无效”

来自分类Dev

MySQL (python 3.6) - SELECT * FROM table - 返回行数而不是表

来自分类Dev

使用staging_table1和table2中的数据插入table1,同时使用staging_table1从table2中获取数据

来自分类Dev

使用staging_table1和table2中的数据插入table1,同时使用staging_table1从table2中获取数据

来自分类Dev

SQL FUNCTION 中的嵌套临时表,如 select from (select..)

来自分类Dev

MongoDB聚合查询与MySQL SELECT字段1 FROM表

来自分类Dev

连接2个表,其中table2每个table1行包含多个行

来自分类Dev

是否可以调用 table3 中 table1 的列,从第二个表开始

来自分类Dev

SQL Server:查询以获取表 2 的 Col2 中条件的 Table1 的 Col1 中的值的总和

来自分类Dev

当table1匹配table2并且table 2行包含特定级别时,使用特定值更新table1上的特定行

Related 相关文章

  1. 1

    使用批处理插入时如何识别错误行(INSERT INTO table2 SELECT * FROM table1)

  2. 2

    使用批处理插入时如何识别错误行(INSERT INTO table2 SELECT * FROM table1)

  3. 3

    MySQL SELECT * FROM table1,table2,table3

  4. 4

    Select ONE random row from Table1 where id does not exist in Table2

  5. 5

    如何从“ TABLE1 AND TABLE2”创建SELECT查询

  6. 6

    mysql union select where table1 field3 = table2 field5

  7. 7

    SQL Server matching all rows from Table1 with all rows from Table2

  8. 8

    SELECT * FROM table_1 WHERE ID =表_2中的ID

  9. 9

    SELECT * FROM table_1 WHERE ID =表_2中的ID

  10. 10

    如何使用与table1不相关的子句正确计算table2中与table1中的项目相关的行

  11. 11

    如何使用 TABLE2 中的值更新 TABLE1 而不将 TABLE1 中的列设置为特定的单个选择语句?

  12. 12

    SELECT FROM table,ORDER BY IF(...)

  13. 13

    使用准备好的语句根据 table1 计算 table2 上的行

  14. 14

    如何通过MYSQL上的数据透视表从table1中选择随机行

  15. 15

    如何将table1包输出表保存为.doc格式?[R

  16. 16

    PHP Union-仅在表名称= table1时显示数据

  17. 17

    如何通过MYSQL上的数据透视表从table1中选择随机行

  18. 18

    MySQL table1和table2如果不存在于表1中显示

  19. 19

    使用缩写代码在 R 中使用 table1 指定自定义渲染器

  20. 20

    使用table1创建汇总表时出错:“ ExtractVars中的模型公式无效”

  21. 21

    MySQL (python 3.6) - SELECT * FROM table - 返回行数而不是表

  22. 22

    使用staging_table1和table2中的数据插入table1,同时使用staging_table1从table2中获取数据

  23. 23

    使用staging_table1和table2中的数据插入table1,同时使用staging_table1从table2中获取数据

  24. 24

    SQL FUNCTION 中的嵌套临时表,如 select from (select..)

  25. 25

    MongoDB聚合查询与MySQL SELECT字段1 FROM表

  26. 26

    连接2个表,其中table2每个table1行包含多个行

  27. 27

    是否可以调用 table3 中 table1 的列,从第二个表开始

  28. 28

    SQL Server:查询以获取表 2 的 Col2 中条件的 Table1 的 Col1 中的值的总和

  29. 29

    当table1匹配table2并且table 2行包含特定级别时,使用特定值更新table1上的特定行

热门标签

归档