SQL Server Create View Index, который содержит отдельный или групповой [закрытый]

У меня есть таблица адресных данных в моей базе данных SQL-сервера. Эта таблица не нормализована, поэтому содержит много повторяющихся адресов. Каждый уникальный адрес можно идентифицировать по полю идентификатора (эти идентификаторы часто повторяются в таблице).

Поэтому я создал представление таблицы для извлечения всех уникальных адресов, используя Select Distinct(AddressId) из исходной таблицы.

Теперь я хотел бы создать индекс в этом представлении, чтобы увеличить скорость поиска, но SQL-сервер не позволяет мне создать индекс в представлении, поскольку оно содержит отдельный или групповой (я пробовал оба, чтобы увидеть, будет ли это позвольте мне создать индекс)

У кого-нибудь есть решение по этому поводу? или любые взгляды на альтернативный способ сделать это.

Мне нужно запросить это представление на основе ключевых слов адреса и вернуть те, которые основаны на количестве совпадений, у меня есть этот запрос, я пытаюсь ускорить его, индексируя поля в представлении.

SQL Server 2008

SELECT      
    AddressId,  
    AddressNumber,  
    AddressName, 
    Town, 
        City,
        Country,
    COUNT_BIG(*) As AddCount--,
    --TRIM(AddressNumber + ' ') + LTRIM(AddressName + ' ')  + LTRIM(Town + ' ') + RTRIM(City + ' ') AS AddressLookup
FROM
    [Address] A
GROUP BY
    AddressId,
    AddressNumber, 
    AddressName, 
    Town, 
    City, 
    Country

мой запрос....

если я уберу столбец с AddressLookup, я смогу добавить индексы

Ваше здоровье


person BBurke    schedule 17.08.2010    source источник
comment
SQL Server разрешает `GROUP BY' в индексированных представлениях. Какая у вас версия?   -  person Martin Smith    schedule 17.08.2010


Ответы (4)


Вы можете использовать GROUP BY в индексированных представлениях, если:

Если указано GROUP BY, список выбора представления должен содержать выражение COUNT_BIG(*), а определение представления не может указывать HAVING, ROLLUP, CUBE или GROUPING SETS.

Взято из MSDN

Включите, но просто проигнорируйте необходимый столбец COUNT_BIG(*).

person Daniel Renshaw    schedule 17.08.2010
comment
когда я использую группу и count_big(*), если получаю следующую ошибку при попытке создать свой индекс в представлении: Невозможно создать кластеризованный индекс «Idx_AddressId» в представлении «AddressLookup», потому что список выбора представления содержит выражение для результат агрегатной функции или столбца группировки. Рассмотрите возможность удаления выражения результата агрегатной функции или столбца группировки из списка выбора. - person BBurke; 17.08.2010
comment
Вы должны использовать какую-то другую агрегатную функцию помимо COUNT_BIG. Вы не сможете использовать агрегатные функции AVG, MAX, MIN, STDEV, STDEVP, VAR или VARP. См. документацию, на которую я ссылаюсь, для получения полной информации. - person Daniel Renshaw; 17.08.2010
comment
Привет, Даниэль, у меня нет других агрегатов в представлении ... как вы можете видеть в сообщении, когда я объединяю столбцы в один, который вызывает мою проблему - person BBurke; 17.08.2010

SQL Server разрешает GROUP BY в индексированных представлениях еще в [SQL2000][1]. Вы уверены, что не смотрели на ограничения для обновляемых представлений?

После вашего редактирования. Вставка конкатенации в таблицу как вычисляемый столбец сработала для меня

CREATE TABLE [Address]
(
    AddressId INT ,
    AddressNumber INT, 
    AddressName VARCHAR(50), 
    Town VARCHAR(50), 
    City VARCHAR(50), 
    Country VARCHAR(50),
    AddressLookup AS LTRIM(AddressNumber + ' ') + LTRIM(AddressName + ' ')  + LTRIM(Town + ' ') + RTRIM(City + ' ')
)
GO

CREATE VIEW AV WITH SCHEMABINDING
AS
SELECT      
    AddressId,  
    AddressNumber,  
    AddressName, 
    Town, 
        City,
        Country,
    COUNT_BIG(*) As AddCount,
    AddressLookup
FROM
    dbo.[Address]
GROUP BY
    AddressId,
    AddressNumber, 
    AddressName, 
    Town, 
    City, 
    Country,
    AddressLookup

   go 

CREATE UNIQUE CLUSTERED INDEX [ix_clustered] ON [dbo].[AV] 
(
    [AddressId] ASC
)
person Martin Smith    schedule 17.08.2010
comment
я получаю ошибки при попытке создать индексы моих представлений, которые имеют разные или групповые значения. Невозможно создать кластеризованный индекс «Idx_AddressId» для представления «AddressLookup», поскольку список выбора представления содержит выражение для результата агрегатной функции или столбца группировки. Рассмотрите возможность удаления выражения результата агрегатной функции или столбца группировки из списка выбора. - person BBurke; 17.08.2010
comment
@Cypher - Можете ли вы опубликовать свое определение вида? Я думаю, что это, вероятно, просто нуждается в небольшой настройке. - person Martin Smith; 17.08.2010
comment
запрос, как указано выше, это строка, в которой я добавляю столбцы адреса вместе, что предотвращает добавление индекса - person BBurke; 17.08.2010
comment
Привет, Мартин, это все еще не позволяет мне создать индекс с этими столбцами объединения. СОЗДАТЬ УНИКАЛЬНЫЙ КЛАСТЕРНЫЙ ИНДЕКС Idx_Address_AddressId ON [AddressLookup] ([AddressId]) выдает ошибку. Невозможно создать кластерный индекс «Idx_AddressId» в представлении «AddressLookup», потому что список выбора представления содержит выражение для результата агрегатной функции или столбца группировки. Рассмотрите возможность удаления выражения результата агрегатной функции или столбца группировки из списка выбора. - person BBurke; 17.08.2010
comment
@Cypher - Похоже, если вы вставите это в вычисляемый столбец, все в порядке! - person Martin Smith; 17.08.2010
comment
существующая таблица содержит данные, которые массово импортируются из файла, который я не хочу изменять, поэтому я подумал, что представление будет идеальным для дедупликации данных, а затем индексировать дедупликацию данных. Может быть, я должен просто перенести его на другой стол - person BBurke; 17.08.2010

Проблема заключается в количестве столбцов в группе по.

На самом деле у меня есть 11 столбцов, по которым я пытаюсь сгруппировать, если я уберу один из этих столбцов, все будет работать нормально.

person BBurke    schedule 17.08.2010

Можно иметь его на 2 столбца:

CREATE UNIQUE CLUSTERED INDEX [ix_clustered] ON [dbo].[AV] 
(
    [AddressId] ASC, 
    [CityId] ASC, 
)
person Imraj Pasricha    schedule 05.01.2012