如何提高查询的性能

时间:2019-01-18 12:36:17

标签: sql database-design sql-server-2014 table-index

下面的查询从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 :(得分:2)

对于此查询:

SELECT DISTINCT ZipCode FROM Address

您要在ZipCode上或至少在ZipCode是第一列的位置上建立索引:

create index idx_address_zipcode on address(zipcode);

最终的执行计划应该是扫描索引,这比处理原始表(并进行汇总以获取不同的邮政编码)要快得多。

您还可以将现有索引更改为(zipcode, city, address1, address2)。这使索引更有用(在我看来),因为zipcodeaddress1更可能用于过滤。但是,该索引将仅比zipcode上的索引大。

答案 1 :(得分: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

如果使用的是Enterprise Edition,则优化器可以考虑索引视图而无需直接引用该视图:

SELECT DISTINCT ZipCode FROM Address;

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

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

有关索引视图的要求,请参见the documentation

答案 2 :(得分:0)

1。如果可能,将ZipCode的数据类型从nvarchar转换为bigint
2.尝试按ZipCode分组

 SELECT ZipCode FROM Address GROUP BY ZipCode;
相关问题