Как улучшить производительность моего запроса
Запрос ниже, чтобы получить различные почтовые индексы от 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);
См. Документацию для требований индексированного представления.