簡體   English   中英

如何提高查詢性能

[英]How to improve the performance of my query

下面的查詢從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

我似乎無法添加執行計划的圖像。

對於此查詢:

SELECT DISTINCT ZipCode FROM Address

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

create index idx_address_zipcode on address(zipcode);

最終的執行計划應該是對索引的掃描,這比處理原始表要快得多(並且進行匯總以獲取不同的郵政編碼)。

您也可以將現有索引更改為(zipcode, city, address1, address2) 這使索引更有用(在我看來),因為與address1相比, zipcode更可能用於過濾。 但是,該索引將比僅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);

請參閱文檔以獲取索引視圖要求。

1.如果可能,將ZipCode數據類型從nvarchar轉換為bigint
2.嘗試通過ZipCode分組

 SELECT ZipCode FROM Address GROUP BY ZipCode;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM