索引此表的最佳方法是什么?

时间:2015-10-20 15:04:13

标签: sql-server indexing

我有下表:

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
)

目前拥有大约2000万条记录,我需要运行查询来计算某个区域的平均价格。例如:

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

WHERE子句可以包含Town,County或Outcode的任意组合,并且可能总是具有PropertyType(这是四个值之一)。我尝试在其中一个字段上创建非聚集索引,但仍然需要大约2分钟才能运行。

当然这应该可以在一秒钟内运行吗?

1 个答案:

答案 0 :(得分:0)

取决于。

  • 如果您的WHERE子句仅返回一小部分记录,则为每个搜索值组合创建一个索引,例如: PropertyType, Town, Country, Outcode上的一个多字段索引,PropertyType, Country, Outcode上的另一个多字段索引,等等。您可以跳过作为现有索引前缀的索引(即,如果您有索引A, B, C, D,则不要“#{1}}。需要A, B, C;但是,如果A, C, D可以省略,则需要B

    您可以通过减少组合数量来减少所需索引的数量:例如,您可以在搜索Country时强制Town - 这是有意义的,因为获得平均值维也纳(奥地利)和维也纳(弗吉尼亚)将毫无用处。

  • 如果您的WHERE子句返回大量记录,那么您的查询将花费大量时间,因为 all 所需的记录需要从HDD或缓存中提取以进行计算平均值。在这种情况下,您可以通过将Price列作为included column添加到索引中来提高性能。这意味着您的查询只需要获取索引而不是实际的行。