为啥临时表会使这个查询变得如此之快?

Posted

技术标签:

【中文标题】为啥临时表会使这个查询变得如此之快?【英文标题】:Why would a temp table make this query so much faster?为什么临时表会使这个查询变得如此之快? 【发布时间】:2013-10-30 15:22:09 【问题描述】:

在尝试剖析运行缓慢的 SQL Server 存储过程时,我们发现仅使用临时表而不是真实表会对性能产生巨大影响。我们要换出的表 (ds_location) 只有 173 行:

此查询将在 1 秒内完成:

IF OBJECT_ID('tempdb..#Location') IS NOT NULL DROP TABLE #Location
SELECT * INTO #Location FROM ds_location 

SELECT COUNT(*) 
FROM wip_cubs_hc m
INNER JOIN ds_scenario sc ON sc.Scenario = m.Scenario
INNER JOIN ds_period pe ON pe.Period = m.ReportingPeriod
INNER JOIN #Location l ON l.Location = m.Sh_Location

与原版比较,耗时 7 秒:

SELECT COUNT(*) 
FROM wip_cubs_hc m
INNER JOIN ds_scenario sc ON sc.Scenario = m.Scenario
INNER JOIN ds_period pe ON pe.Period = m.ReportingPeriod
INNER JOIN ds_location l ON l.Location = m.Sh_Location

这是 wip_cubs_hc 的定义。它包含 170 万行:

CREATE TABLE wip_cubs_hc(
    Scenario varchar(16) NOT NULL,
    ReportingPeriod varchar(50) NOT NULL,
    Sh_Location varchar(50) NOT NULL,
    Department varchar(50) NOT NULL,
    ProductName varchar(75) NOT NULL,
    Account varchar(50) NOT NULL,
    Balance varchar(50) NOT NULL,
    Source varchar(50) NOT NULL,
    Data numeric(18, 6) NOT NULL,
    CONSTRAINT PK_wip_cubs_hc PRIMARY KEY CLUSTERED 
    (
        Scenario ASC,
        ReportingPeriod ASC,
        Sh_Location ASC,
        Department ASC,
        ProductName ASC,
        Account ASC,
        Balance ASC,
        Source ASC
    )
)

CREATE NONCLUSTERED INDEX IX_wip_cubs_hc_Balance
ON [dbo].[wip_cubs_hc] ([Scenario],[Sh_Location],[Department],[Balance])
INCLUDE ([ReportingPeriod],[ProductName],[Account],[Source])

我也很想知道如何确定导致减速的原因。

【问题讨论】:

请在此处阅读已接受的答案:***.com/questions/2825342/… 【参考方案1】:

我可以回答“如何确定减速”的问题...

看看这两个查询的执行计划。您可以通过转到“查询”菜单 >“显示估计的执行计划”来执行此操作。默认的键盘快捷键是 Ctrl+L。您也可以一次查看多个查询的计划。查看正在执行的操作类型。您希望看到的是 Index Seek 而不是 Index Scan 等。

This article 解释了其他一些要查找的内容。

在不知道所涉及的所有表的架构/索引的情况下,我建议从这里开始。

祝你好运!

【讨论】:

PS:您可以在一个过程上使用执行计划,并查看批处理中所有语句的计划。

以上是关于为啥临时表会使这个查询变得如此之快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 CTE 比游标/派生表/子查询/临时表等更好?

临时表与中间表

mysql如何创建临时表

JAVA进阶:提高SQL性能的几种方法

高手们 为啥数据库查询语句加了order by 变得很慢 表中有六千多条记录 现在打开很慢 啥原因

SQL Server 表变量和临时表的区别