[英]How to improve SQL Server query performance
表格大小32GB行數250M
表DDL
CREATE TABLE Orders
(
ID [int] IDENTITY(1,1) NOT NULL,
server [varchar](50) NULL,
server_id [int] NOT NULL,
merchant_id [int] NOT NULL,
order_id [int] NOT NULL,
customer_id [int] NOT NULL,
customer_name [varchar](50) NULL,
[amount] [money] NULL,
order_date [smalldatetime] NULL,
ship_date [smalldatetime] NULL,
order_status [varchar](50) NULL,
custom_field_1 [varchar](50) NULL,
custom_field_2 [varchar](50) NULL,
custom_field_3 [varchar](50) NULL,
custom_field_4 [varchar](50) NULL,
created_at [datetime] NULL
CONSTRAINT [PK_Orders]
PRIMARY KEY CLUSTERED ([ID] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我有以下非聚集索引
merchant_id, order_id
order_date
邏輯上, order_id
, merchant_id
order_id
是唯一的鍵。
像下面這樣的簡單查詢將花費近30分鍾。
select
sum(amount)
from
Orders
where
Order_Date >= getdate() - 7
我有幾個問題:
order_id
和merchant_id
用作PK會對性能有幫助嗎? PK是對的嗎?
大概。 使用這種替代id
為聚集鍵通過使用薄的4個字節的密鑰,而不是復合12字節的密鑰的保持存儲所有索引的開銷較低merchant_id, order_id, order_date
或8字節密鑰merchant_id, order_id
聚簇鍵是每個索引如何指向表的其余部分。
將order_id和merchant_id用作PK會對性能有幫助嗎?
您將必須查看對針對該表運行的所有查詢的影響,以了解是否有幫助。
我將專注於評估需要更快運行的查詢的覆蓋索引,如果您發現一種趨勢,其中大多數查詢都需要這兩列,那么也許吧。
我在這張桌子上應該有什么理想的指標?
您需要查看查詢,執行計划和當前索引使用情況,才能確定該表需要哪些索引。
由於您的order_date
不是非聚集索引的第一列,因此優化程序很可能不會將其用於示例查詢。
即使您在order_date
上具有索引,也必須返回表以獲取amount
。 如果您在索引中的“包含”列中包含“ amount
,則它將成為該查詢的覆蓋索引,而無需返回到表。
對於該示例查詢,您可以使用類似以下內容的方法來進行僅索引的查詢,而不是使用表查找的查詢:
create nonclustered index ix_Orders (Order_Date) include (amount);
您需要的是日期索引。 在日期上創建非聚集索引將有助於提高性能。 索引對於查詢性能非常重要。 首先,您應該在案件日期字段的where子句中大量使用的那些列上具有索引。
https://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/
您只需要更改Order_Date上的索引,使其覆蓋包括Amount列在內的索引即可。 @Lamark https://www.simple-talk.com/sql/learn-sql-server/using-covering-indexes-to-improve-query-performance/提出了相同的建議
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.