0

下面的查询从表中获取不同的邮政编码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

我似乎无法添加执行计划的图像。

4

3 回答 3

2

对于此查询:

SELECT DISTINCT ZipCode FROM Address

您希望在第一列上ZipCode或至少在哪里建立索引:ZipCode

create index idx_address_zipcode on address(zipcode);

生成的执行计划应该是对索引的扫描,这比处理原始表(并聚合以获取不同的邮政编码)要快得多。

您还可以将现有索引更改为(zipcode, city, address1, address2). 这使得索引更有用(在我看来),因为zipcode它更有可能用于过滤而不是address1. 但是,该索引仅在 上大于 1 zipcode

于 2019-01-18T12:37:38.100 回答
0

为了获得最佳性能,您可以创建一个索引视图,以便实现聚合:

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

如果您使用的是企业版,优化器可以考虑索引视图而不直接引用视图:

SELECT DISTINCT ZipCode FROM Address;

在较小的版本中,您需要查询视图并添加NOEXPAND查询提示,以便考虑对索引进行优化:

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

有关索引视图要求,请参阅文档

于 2019-01-18T12:45:41.790 回答
0

1.如果可能,将ZipCode数据类型从转换nvarcharbigint
2.尝试分组ZipCode

 SELECT ZipCode FROM Address GROUP BY ZipCode;
于 2019-01-18T12:57:40.673 回答