我有一個超過一億行的巨大表格,我必須查詢此表格才能在最短的時間內返回一組數據。在閱讀巨大表格時的性能調整
所以我創建了一個測試環境,這個表的定義:
CREATE TABLE [dbo].[Test](
[Dim1ID] [nvarchar](20) NOT NULL,
[Dim2ID] [nvarchar](20) NOT NULL,
[Dim3ID] [nvarchar](4) NOT NULL,
[Dim4ID] [smalldatetime] NOT NULL,
[Dim5ID] [nvarchar](20) NOT NULL,
[Dim6ID] [nvarchar](4) NOT NULL,
[Dim7ID] [nvarchar](4) NOT NULL,
[Dim8ID] [nvarchar](4) NOT NULL,
[Dim9ID] [nvarchar](4) NOT NULL,
[Dim10ID] [nvarchar](4) NOT NULL,
[Dim11ID] [nvarchar](20) NOT NULL,
[Value] [decimal](21, 6) NOT NULL,
CONSTRAINT [PK_Test] PRIMARY KEY CLUSTERED
(
[Dim1ID] ASC,
[Dim2ID] ASC,
[Dim3ID] ASC,
[Dim4ID] ASC,
[Dim5ID] ASC,
[Dim6ID] ASC,
[Dim7ID] ASC,
[Dim8ID] ASC,
[Dim9ID] ASC,
[Dim10ID] ASC,
[Dim11ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
此表是星型模式架構(事實上/尺寸)的事實表。正如你所看到的,除了「Value」列之外,我在所有列上都有一個聚集索引。
我已經用大約填充了這些數據。 10,000,000行用於測試目的。碎片率目前爲0.01%。
我想使用此查詢從該表中讀取的行集時提高性能:
DECLARE @Dim1ID nvarchar(20) = 'C1'
DECLARE @Dim9ID nvarchar(4) = 'VRT1'
DECLARE @Dim10ID nvarchar(4) = 'S1'
DECLARE @Dim6ID nvarchar(4) = 'FRA'
DECLARE @Dim7ID nvarchar(4) = '' -- empty = all
DECLARE @Dim8ID nvarchar(4) = '' -- empty = all
DECLARE @Dim2 TABLE (Dim2ID nvarchar(20) NOT NULL)
INSERT INTO @Dim2 VALUES ('A1'), ('A2'), ('A3'), ('A4');
DECLARE @Dim3 TABLE (Dim3ID nvarchar(4) NOT NULL)
INSERT INTO @Dim3 VALUES ('P1');
DECLARE @Dim4ID TABLE (Dim4ID smalldatetime NOT NULL)
INSERT INTO @Dim4ID VALUES ('2009-01-01'), ('2009-01-02'), ('2009-01-03');
DECLARE @Dim11 TABLE (Dim11ID nvarchar(20) NOT NULL)
INSERT INTO @Dim11 VALUES ('Var0001'), ('Var0040'), ('Var0060'), ('Var0099')
SELECT RD.Dim2ID,
RD.Dim3ID,
RD.Dim4ID,
RD.Dim5ID,
RD.Dim6ID,
RD.Dim7ID,
RD.Dim8ID,
RD.Dim9ID,
RD.Dim10ID,
RD.Dim11ID,
RD.Value
FROM dbo.Test RD
INNER JOIN @Dim2 R
ON RD.Dim2ID = R.Dim2ID
INNER JOIN @Dim3 C
ON RD.Dim3ID = C.Dim3ID
INNER JOIN @Dim4ID P
ON RD.Dim4ID = P.Dim4ID
INNER JOIN @Dim11 V
ON RD.Dim11ID = V.Dim11ID
WHERE RD.Dim1ID = @Dim1ID
AND RD.Dim9ID = @Dim9ID
AND ((@Dim6ID <> '' AND RD.Dim6ID = @Dim6ID) OR @Dim6ID = '')
AND ((@Dim7ID <> '' AND RD.Dim7ID = @Dim7ID) OR @Dim7ID = '')
AND ((@Dim8ID <>'' AND RD.Dim8ID = @Dim8ID) OR @Dim8ID = '')
我已經測試過該查詢和所返回180行這些時間: 1日執行: 1分32秒;第二次執行:1分鐘。
如果可能,我想在幾秒鐘內返回數據。
我想我可以添加非聚集索引,但我不知道最好的方法是設置非聚集索引! 如果在此表中排序了訂單數據可以提高績效? 還是有其他解決方案比索引?
謝謝。
腦融化。什麼是變量命名? – 2011-03-28 16:26:36
爲了保密,我寧願不要輸入真實姓名。但我想我可以寫出虛擬名字。 – Dan 2011-03-28 16:45:38