簡體   English   中英

如何提高SQL Server查詢性能

[英]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_idmerchant_id order_id是唯一的鍵。

像下面這樣的簡單查詢將花費近30分鍾。

select 
    sum(amount)
from 
    Orders 
where 
    Order_Date >= getdate() - 7

我有幾個問題:

  • PK對嗎? 當前它在ID字段上,並且沒有被使用。
  • order_idmerchant_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.

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