0

在尝试剖析运行缓慢的 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])

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

4

1 回答 1

0

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

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

本文解释了其他一些要寻找的东西。

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

祝你好运!

于 2013-10-30T15:34:16.550 回答