在尝试剖析运行缓慢的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])
我很想知道如何确定导致经济放缓的原因。
答案 0 :(得分:0)
我可以回答“如何确定减速”问题......
查看两个查询的执行计划。您可以通过转到“查询”菜单>来执行此操作“显示预计执行计划”。默认键盘快捷键是Ctrl + L.您也可以同时查看多个查询的计划。看看正在进行的操作类型。您希望看到的是Index Seek而不是Index Scan等。
This article解释了一些其他要寻找的事情。
在不知道所涉及的所有表的模式/索引的情况下,这是我建议开始的地方。
最好的运气!