[英]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.