2013-03-28 116 views
0

我對數據庫感興趣,並開始使用SQL Server 2008,我讀過使用表上適當的索引可以幫助提高數據庫的整體性能。SQL Server索引性能

我有兩個表和自動生成的在使用SQL數據生成每個表一個百萬行,表1是一個客戶表和表2是一個租戶表中,設計如下:

Customer         Renters 
CustomerID (PK)        RentersID (PK) 
ForeName (Non clustered index)    StartDate 
SurName          EndDate 
Email          RentalNights 
              CustomerID (FK) (Non Clustered index) 

我已經讀過在最常用的列和外鍵列上放置非聚集索引將有助於提高性能。在使用索引之前和使用索引之後,我創建了一個簡單的連接查詢,但對於我來說,在使用索引時我看不到增加的性能,任何主體都可以幫助我?下面的圖片是索引之前和使用它們之後的執行計劃。

前指標: enter image description here

之後索引: enter image description here

編輯: 這是我使用

SELECT cu.ForeName + ' ' + cu.SurName AS 'Name' 
FROM dbo.Customers cu 
INNER JOIN dbo.Renters re ON re.CustomerID = cu.CustomerID 
WHERE cu.ForeName = 'Daniel' 

編輯 SQL語法這是我的索引使用o的語法內斯貼在下面的回覆:

CREATE NONCLUSTERED INDEX [ix_Customer] ON [dbo].[Customers] ( [ForeName] ASC, [CustomerID] ASC ) INCLUDE ([SurName]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO

+0

你能否還請顯示導致這些執行計劃的** SQL查詢**? –

+0

也顯示索引的代碼? – JNK

+0

另外,它看起來像你正在使用你的索引,性能是否一樣?是否需要同時運行這兩個查詢? – JNK

回答

4

根據您的查詢的最佳非聚集索引建會:

CREATE NONCLUSTERED INDEX ix_IndexA on dbo.Customers (Forename, CustomerID) 
    INCLUDE (SurName) 

CREATE NONCLUSTERED INDEX ix_IndexB on dbo.Renters (CustomerID) 

你希望你的重點領域是在你的過濾器或JOIN列,並且您的INCLUDE列處於葉級別以便返回SELECT

+0

嗨@JNK,我只是想問你INCLUDE(S​​urName),這是什麼,因爲我不是100%確定? – Peter

+1

@Peter'INCLUDE'將INCLUDED列的數據保留在索引的樹葉級別中,但不保存在樹中 - 如果您想到像電話簿這樣的索引,則會在'LastName,Firstname'(它是如何排序的)但葉級別(條目)也具有「PhoneNo,Address,Zipcode」數據。您無法通過「PhoneNo」進行排序,但一旦您進入該條目,您就可以獲得該數據。在你的查詢中,你是'SELECT'姓氏,但它不在你的任何索引關鍵字中,而且你也不會對它進行排序,因此我將它包含在內。這避免了引擎查詢數據的聚集索引的關鍵查找或書籤查找。 – JNK