3

さまざまなレポート用に作成した一連のビューがあります。それらは、5,000 件未満のレコードを返す最終ビューに向けて相互に構築されます。このビューを開くと、実行に 1 秒もかかりません。を追加するWHERE collumn IS NOT NULLと、2分以上かかります。あまり頻繁に実行する必要のないレポートにはこれで問題ありませんが、毎週、毎日、時にはもっと頻繁に実行しなければならないレポートもあります。

私の解決策は、ビューのデータからテーブルを作成するストアド プロシージャを作成し、それをクエリすることでした。スケジュールされたレポートが自動的に起動する前にストアド プロシージャを実行するように設定しました。これは問題なく機能しますが、更新されたレポートを取得するたびにストアド プロシージャを手動で実行する必要があります。

より良い方法はありますか?

[MW_Submitted_ROY] を表示して、Submitted Weeks の財務を検索します。このビューは、アクティブなテーブルを静的テーブルの履歴データと結合します。静的テーブルのデータがアクティブ テーブルと同じ形式になるように調整しました。

SELECT     oe_po_no, cus_no, user_def_fld_1, user_def_fld_2, tot_sls_amt
FROM         MW_Submitted_Weeks_OldMacola
WHERE     MW_Submitted_Weeks_OldMacola.oe_po_no LIKE 'adv%'
UNION
SELECT     oe_po_no, cus_no, user_def_fld_1, user_def_fld_2, tot_sls_amt
FROM         oehdrhst_sql
WHERE     oehdrhst_sql.oe_po_no LIKE 'adv%'

[MW_Company_Weeks] を表示して、企業ごとに、今年度と前年度の財務報告を提出する可能性のあるすべての週を生成します。

SELECT     MW.MW_Weeks.Year, MW.MW_Weeks.Week, MW.MW_CompanyCodes.cmp_code
FROM         MW.MW_Weeks CROSS JOIN
                  MW.MW_CompanyCodes
 WHERE     (MW.MW_Weeks.WEDate <= GETDATE()) AND (MW.MW_Weeks.Year > YEAR(GETDATE()) - 2)

[MW_Submitted_Weeks_By_RBC_ROY] を表示すると、レポートを作成するために必要な会社に関する詳細情報がまとめられています

 SELECT     dbo.cicmpy.textfield2 AS [Group], dbo.cicmpy.cmp_code, dbo.cicmpy.cmp_name,          dbo.cicmpy.cmp_fadd3 AS Owner, dbo.cicmpy.SalesPersonNumber, 
                  MW.MW_Submitted_ROY.user_def_fld_1 AS Year, MW.MW_Submitted_ROY.user_def_fld_2 AS Week, MW.MW_Submitted_ROY.oe_po_no AS Description, 
                  MW.MW_Submitted_ROY.tot_sls_amt
 FROM         dbo.cicmpy INNER JOIN
                  MW.MW_Submitted_ROY ON dbo.cicmpy.cmp_code = MW.MW_Submitted_ROY.cus_no
 WHERE     (dbo.cicmpy.cmp_code LIKE 'C%') AND (dbo.cicmpy.cmp_status = 'a') AND (dbo.cicmpy.cmp_type = 'C')

これにより、最後のビュー [MW_Missing_Weeks] が表示され、欠落している週と、提出された前年の財務報告の値が表示されます。これは、「is not null」を追加すると、永遠にかかる場所です。

 SELECT     MW.MW_Company_Weeks.Year, MW.MW_Company_Weeks.Week, MW.MW_Company_Weeks.cmp_code, bPrev.tot_sls_amt, bPrev.[Group], bPrev.cmp_name, bPrev.Owner, 
                  bPrev.SalesPersonNumber, bPrev.Description
 FROM         MW.MW_Company_Weeks LEFT OUTER JOIN
                  MW.MW_Submitted_Weeks_By_RBC_ROY ON MW.MW_Company_Weeks.cmp_code = MW.MW_Submitted_Weeks_By_RBC_ROY.cmp_code AND 
                  MW.MW_Company_Weeks.Year = MW.MW_Submitted_Weeks_By_RBC_ROY.Year AND MW.MW_Company_Weeks.Week = MW.MW_Submitted_Weeks_By_RBC_ROY.Week LEFT OUTER JOIN
                  MW.MW_Submitted_Weeks_By_RBC_ROY AS bPrev ON MW.MW_Company_Weeks.cmp_code = bPrev.cmp_code AND MW.MW_Company_Weeks.Year = bPrev.Year + 1 AND 
                  MW.MW_Company_Weeks.Week = bPrev.Week
 WHERE     (MW.MW_Submitted_Weeks_By_RBC_ROY.cmp_code IS NULL) AND bPrev.tot_sls_amt IS NOT NULL
4

1 に答える 1

7

SSMS で [クエリ] > [推定実行計画の表示] に移動するか、 を押しCtrl + Lます。最も高いパーセンテージを占める計画の部分を見つけ、緑の「Missing Index」があるかどうかを確認します。右クリックして、[Missing Index Details] を選択します。これにより、インデックスを作成するコードが作成されます。インデックス名を追加するだけです。

次のようになります。

/*
USE [Your Database]
GO
CREATE NONCLUSTERED INDEX [<Name of Missing Index, sysname,>]
ON [dbo].[YourTable] ([ColA])
INCLUDE ([ColB],[ColC])
GO
*/

これは、インデックスを作成する手っ取り早い方法です。

クエリ実行プランを使用して、問題のトラブルシューティングも行うことができます。少し練習が必要です。

于 2013-10-02T18:16:50.033 に答える