2015-10-20 4 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 

ИНЕКЕ может иметь любую комбинацию из города, округа или Outcode, и, вероятно, всегда есть PropertyType (который является одним из четырех значений). Я попытался создать некластеризованный индекс в одном из полей, но для выполнения все еще требуется около 2 минут.

Несомненно, это должно быть в состоянии работать в течение секунды?

+0

Google и узнайте о «Covering Index» и создайте индекс, который охватывает все запрошенные вами запросы. –

ответ

0

зависит от цели.

  • Если ваш ИНЕКЕ возвращает только небольшое подмножество записей, а затем создать индекс для каждой комбинации значений поиска, например, один многопольный индекс на PropertyType, Town, Country, Outcode, другой на и т. д. Вы можете пропустить индексы, которые являются префиксами существующих индексов (т. е. если у вас есть индекс A, B, C, D, вам не нужен A, B, C, однако вам нужно A, C, D, если B может быть опущен).

    Вы можете уменьшить количество необходимых индексов, уменьшив количество комбинаций: например, вы можете сделать Country обязательным при поиске Town - что будет иметь смысл, так как получение среднего значения по Вене (Австрия) и Вене (Виргина) было бы совершенно бесполезно.

  • Если ваш ИНЕКЕ возвращает большой набор записей, ваш запрос займет много времени, так или иначе, так как все выбранных записей должны быть выбраны с жесткого диска или кэша для вычисления среднего значения. В этом случае вы можете увеличить производительность, включив столбец Price в свои индексы как included column. Это означает, что ваш запрос будет иметь только выборку, а не фактические строки.

+0

Спасибо, это, казалось, улучшило ситуацию довольно много. Я включил цену на индекс. – Tom

Смежные вопросы