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 です。複数のクエリの計画も一度に表示できます。実行中の操作のタイプを見てください。見たいのは、インデックススキャンではなくインデックスシークなどです。

この記事では、その他の注意事項について説明します。

関連するすべてのテーブルのスキーマ/インデックスを知らなくても、ここから始めることをお勧めします。

幸運を祈ります!

于 2013-10-30T15:34:16.550 に答える