2013-06-12 72 views
1

我只想知道如何索引此表以獲得最佳性能?這將有可能保持約20M行。如何通過索引提高我的查詢性能

CREATE TABLE [dbo].[Table1]( 
    [ID] [bigint] NOT NULL, 
    [Col1] [varchar](100) NULL, 
    [Col2] [varchar](100) NULL, 
    [Description] [varchar](100) NULL 
) ON [PRIMARY] 

基本上,這個表格只會以這種方式被查詢。

SELECT ID FROM Table1 
    WHERE Col1 = 'exactVal1' AND Col2 = 'exactVal2' AND [Description] = 'exactDesc' 

這是我做過什麼:

CREATE NONCLUSTERED INDEX IX_ID 
    ON Table1(ID) 
    GO 

    CREATE NONCLUSTERED INDEX IX_Col1 
    ON Table1(Col1) 
    GO 

    CREATE NONCLUSTERED INDEX IX_Col2 
    ON Table1(Col2) 
    GO 

    CREATE NONCLUSTERED INDEX IX_ValueDescription 
    ON Table1(ValueDescription) 
    GO 

我說得對不對索引所有這些列?還沒有那麼自信。剛接觸SQL的東西,請讓我知道如果我在正確的軌道上。

再次,大量的數據將放在這張桌子上。不幸的是,由於沒有可用的數據,我無法測試性能。但我很快會生成一些虛擬數據來測試性能。但如果已經有另一個選項(建議)可用,我可以將結果與之比較,那就太好了。

感謝, 插孔

回答

2

我將這些指標合併成一個指數,而不是有三個獨立的索引。例如:

CREATE INDEX ix_cols ON dbo.Table1 (Col1, Col2, Description) 

如果列的這種組合是表中是唯一的,那麼你應該加入特殊的關鍵字,以使索引唯一。這是出於性能方面的原因,但更重要的是,要強制執行唯一性。如果合適的話,它也可以被創建爲主鍵。

將所有列放在一個索引中將會提供更好的性能,因爲SQL Server不需要使用多個通道來查找您正在尋找的行。

+0

IM不知道這種方法的又..我認爲這是類似於我做了什麼:) 我要它使用這種方法進行測試,看看性能如何,並會在完成後給您提供反饋。 謝謝!順便提一下, – jackCaller

+0

,ID列怎麼樣?是否有必要將它作爲索引?它包含唯一值,但不會包含在過濾器(WHERE子句)中。 – jackCaller

+0

+1 - 同意此解決方案。 – Devart

1

試試這個 -

CREATE TABLE dbo.Table1 
(
     ID BIGINT NOT NULL 
    , Col1 VARCHAR(100) NULL 
    , Col2 VARCHAR(100) NULL 
    , [Description] VARCHAR(100) NULL 
) 
GO 

CREATE CLUSTERED INDEX IX_Table1 ON dbo.Table1 
(
     Col1 
    , Col2 
    , [Description] 
) 

或者這 -

CREATE TABLE dbo.Table1 
(
     ID BIGINT PRIMARY KEY NOT NULL 
    , Col1 VARCHAR(100) NULL 
    , Col2 VARCHAR(100) NULL 
    , [Description] VARCHAR(100) NULL 
) 
GO 

CREATE UNIQUE NONCLUSTERED INDEX IX_Table1 ON dbo.Table1 
(
     Col1 
    , Col2 
    , [Description] 
)