我有下表:
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分钟才能运行。
当然这应该可以在一秒钟内运行吗?
答案 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添加到索引中来提高性能。这意味着您的查询只需要获取索引而不是实际的行。