2015-10-20 77 views
0

我有如下表:什麼是指數的最佳途徑此表

CREATE TABLE [dbo].[HousePrices](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [PropertyType] [int] NULL, 
    [Town] [nvarchar](500) NULL, 
    [County] [nvarchar](500) NULL, 
    [Outcode] [nvarchar](10) NULL, 
    [Price] [int] NULL 
PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
) 

目前持有大約20萬條記錄,我需要運行查詢計算在一定區域內的平均價格。例如:

select avg(price) 
from houseprices 
where town = 'London' 
     and propertytype = 1 

WHERE子句可以有鎮,縣或的Outcode的任意組合,並且可能會永遠有屬性類型(這是四個值之一)。我嘗試在其中一個字段上創建非聚集索引,但仍需要大約2分鐘才能運行。

當然,這應該能夠在一秒之內運行?

+0

谷歌和了解「覆蓋索引」並創建一個索引,涵蓋您可能運行的所有查詢。 –

回答

0

這取決於。

  • 如果WHERE子句只返回的記錄一小部分,那麼對於搜索的每個組合創建索引,例如一個多字段索引PropertyType, Town, Country, Outcode,另一個字段PropertyType, Country, Outcode等。您可以跳過作爲現有索引前綴的索引(即如果索引爲A, B, C, D,則不需要A, B, C;但是,如果B可以,則確實需要A, C, D省略)。

    您可以通過減少組合的數量來減少所需索引的數量:例如,在搜索Town時,您可以使Country爲必填字段 - 這是合理的,因爲在維也納(奧地利)和維也納Virgina)將是無用的。

  • 如果WHERE子句返回大量記錄,您的查詢將花費大量的時間,無論如何,因爲所有選定的記錄需要從硬盤或緩存來計算平均進賬。在這種情況下,可以通過在索引中包含Price列作爲included column來提高性能。這意味着你的查詢只需要獲取索引而不是實際的行。

+0

謝謝,這似乎改善了很多事情。我已將價格包含在指數中。 – Tom