現在、クエリとストアド プロシージャのパフォーマンスの問題に直面しています。シナリオは次のとおりです。
SQL Server 2000 SP4
データベース ( ) には、膨大な量のレコードを持つ 3 ~ 4 個のテーブルがあります。テーブルの 1 つには、2,500 万を超えるレコードがあります。これらのテーブルは、販売記録を維持しており、毎日何千もの記録が追加されています。ストアド プロシージャが実行されるたびに、完了するまでに 15 ~ 30 分かかります。テーブルには 3 ~ 4 個の結合があります。ユーザーはそれについて頻繁に不平を言っています。インデックスは正しいです。パフォーマンスを向上させるために、分割されたビューを実装しました。MSDNの以下の記事を参考に解決策を実装しました
販売記録を年ごとに分割したところ、パフォーマンスが向上し、クエリ/ストアド プロシージャの実行に 3 ~ 5 分かかるようになりました。パフォーマンスをさらに向上させるために、販売記録を月ごとに分割します。4 年間のデータを維持しており、現在、売上データ用のテーブルが 48 近くあります (売上データを月ごとに分割した後)。これによりパフォーマンスが向上することを期待していました。しかし、それは起こっていません。クエリの実行が以前のもの (年ごとのデータ分割) よりもはるかに遅く、驚いています。また、クエリ プランを調べたところ、関連するテーブルのみをスキャンするのではなく、48 個の sales テーブルすべてに対してインデックス スキャンを実行していることがわかりました。たとえば、期間19-NOV-2012
とのストア プロシージャを照会する場合、2 つのテーブル
と20-DEC-2012
のみを考慮する必要があります。NOV-2012
DEC-2012
. ただし、48 個のテーブルすべてを考慮しています。だから私の質問は:
関連するテーブルのみを考慮するのではなく、すべてのテーブルを考慮するのはなぜですか。たとえば、上記の例では
NOV-2012
、DEC-2012
年ごとのロジック (販売レコードを年ごとに分割) が月ごとのロジック (販売レコードを月ごとに分割) よりも優れている理由
以下は、分割ビューのコードです。
例 年 その他の年は省略します。
SELECT * FROM tbl_Sales_Jan2010
UNION ALL
SELECT * FROM tbl_Sales_Feb2010
UNION ALL
SELECT * FROM tbl_Sales_Mar2010
UNION ALL
SELECT * FROM tbl_Sales_Apr2010
UNION ALL
SELECT * FROM tbl_Sales_May2010
UNION ALL
SELECT * FROM tbl_Sales_Jun2010
UNION ALL
SELECT * FROM tbl_Sales_Jul2010
UNION ALL
SELECT * FROM tbl_Sales_Aug2010
UNION ALL
SELECT * FROM tbl_Sales_Sep2010
UNION ALL
SELECT * FROM tbl_Sales_Oct2010
UNION ALL
SELECT * FROM tbl_Sales_Nov2010
UNION ALL
SELECT * FROM tbl_Sales_Dec2010
以下はテーブル構造です。
CREATE TABLE [dbo].[tbl_Sales_Jan2010](
[SalesID] [numeric](10, 0) NOT NULL,
[StoreNumber] [char](3) NOT NULL,
[SomeColumn1] [varchar](15) NOT NULL,
[Quantity] [int] NOT NULL,
[SalePrice] [numeric](18, 2) NOT NULL,
[SaleDate] [datetime] NOT NULL,
[DeptID] [int] NOT NULL,
[CatCode] [char](3) NOT NULL,
[AuditDate] [datetime] NOT NULL CONSTRAINT [DF_tbl_Sales_Jan2010_EditDate] DEFAULT (getdate()),
[SomeColumn2] [varchar](15) NULL,
[SaleMonthYear] [int] NULL CONSTRAINT [DF__tbl_Sales__SaleY__Jan2010] DEFAULT (12010),
[SaleDateInIntFormat] [int] NULL,
CONSTRAINT [PK_tbl_Sales_Jan2010] PRIMARY KEY CLUSTERED
(
[SalesID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[tbl_Sales_Jan2010] WITH CHECK ADD CHECK (([SaleMonthYear] = 12010))
以下はクエリです
SELECT SUM(C.Quantity) as total
FROM Productdatabase.dbo.tbl_Product A , Productdatabase.dbo.tbl_Product_Category B, XDatabase.dbo.vw_Sales_Test C, tbl_Store D
WHERE A.ProductID = B.ProductID AND B.CategoryID = @CateID
AND C.SomeColumn = A.PRoductCode
AND D.StoreCode = C.StoreNumber
AND D.country = @country
AND D.status = 0
And C.SaleMonthYear between @BeginMonthYear and @EndMonthYear
AND C.SalDate between @FromSaleDate and @ToSaleDate