Как улучшить производительность моего запроса - PullRequest
0 голосов
/ 18 января 2019

Запрос ниже для получения различных почтовых индексов из таблицы Address занимает примерно 4 минуты и 42 секунды.В таблице Address содержится 1 006 699 записей.Составной ключ для таблицы - 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 ]

0 голосов
/ 18 января 2019

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

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);

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

0 голосов
/ 18 января 2019

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

 SELECT ZipCode FROM Address GROUP BY ZipCode;
0 голосов
/ 18 января 2019

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

SELECT DISTINCT ZipCode FROM Address

Требуется индекс для ZipCode или, по крайней мере, где ZipCode - первый столбец:

create index idx_address_zipcode on address(zipcode);

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

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

...