Как улучшить производительность моего запроса

Запрос ниже, чтобы получить различные почтовые индексы от Address Стол занимает примерно 4 минуты и 42 секунды. Есть 1 006 699 записей в Address Таблица. Составной ключ для таблицы Address1, Address2, City, ZipCode,

Были случаи, когда выполнение запроса занимало 5 секунд или даже 1 миллисекунду.

Как мне улучшить производительность запроса?

Вот SQL-запрос:

 SELECT DISTINCT ZipCode FROM Address

Вот схема для таблицы:

CREATE TABLE [dbo].[Address]
(
    [AddressID] [INT] IDENTITY(1,1) NOT NULL,
    [Address1] [NVARCHAR](1000) NOT NULL,
    [Address2] [NVARCHAR](1000) NOT NULL,
    [City] [NVARCHAR](1000) NOT NULL,
    [StateCd] [NVARCHAR](2) NULL,
    [ZipCode] [NVARCHAR](10) NOT NULL,

    PRIMARY KEY CLUSTERED 
    ([Address1] ASC, [Address2] ASC, [City] ASC, [ZipCode] ASC)
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[Address] ADD DEFAULT ('') FOR [Address2]
GO

Я не могу добавить изображение плана выполнения.

3 ответа

Решение

Для этого запроса:

SELECT DISTINCT ZipCode FROM Address

Вы хотите индекс на ZipCode или хотя бы где ZipCode это первый столбец:

create index idx_address_zipcode on address(zipcode);

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

Вы также можете изменить существующий индекс на (zipcode, city, address1, address2), Это делает индекс более полезным (на мой взгляд), потому что zipcode более вероятно, будет использоваться для фильтрации, чем address1, Однако этот индекс будет больше единицы только на zipcode,

1. Если возможно конвертировать ZipCode тип данных из nvarchar в bigint,
2. попробуйте группу ZipCode

 SELECT ZipCode FROM Address GROUP BY ZipCode;

Для максимальной производительности вы можете создать индексированное представление, чтобы агрегация материализовалась:

CREATE VIEW vw_Address_ZipCode
WITH SCHEMABINDING
AS
SELECT ZipCode, COUNT_BIG(*) AS ZipCodeCount
FROM dbo.Address
GROUP BY ZipCode;
GO
CREATE UNIQUE CLUSTERED INDEX cdx ON dbo.vw_Address_ZipCode(ZipCode);
GO

Если вы используете Enterprise Edition, оптимизатор может рассмотреть индексированное представление без прямой ссылки на представление:

SELECT DISTINCT ZipCode FROM Address;

В меньших выпусках вам нужно запросить представление и добавить NOEXPAND подсказка запроса, поэтому индекс рассматривается для оптимизации:

SELECT DISTINCT ZipCode FROM dbo.vw_Address_ZipCode WITH(NOEXPAND);

См. Документацию для требований индексированного представления.

Другие вопросы по тегам