簡體   English   中英

SQL 服務器:非聚集索引不起作用

[英]SQL Server : non-clustered index is not working

我有一個包含幾列的表,包括一個主鍵。 我在表上創建了這個非聚集索引:

CREATE NONCLUSTERED INDEX [nci_wi_plan_239F85C77AF7B2990845ACFEE404C263] 
ON dbo.[Plans] ([template_id] ASC, [deleted] ASC)
INCLUDE([HasWorkouts]) WITH (STATISTICS_NORECOMPUTE = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON [PRIMARY]
GO

我在存儲過程中執行此查詢以從表中獲取結果:

select 
     dp.id
    ,dp.HasWorkouts
from dbo.Plans dp
where dp.template_id= @TemplateId and dp.deleted = 0 
--((@TemplateId = 0 or @TemplateId is null) or (dp.template_id= @TemplateId)) // not working if I use this line

在上面的查詢中,非聚集索引僅在我使用一些 id 指示檢查template_id時才有效。 但有時我可能不需要檢查dp.template_id所以我在執行過程時將0 or null設置為@TemplateId 有沒有辦法檢查或跳過template_id以及非聚集索引?

編輯:-

檢查下面的屏幕截圖。 如果我在 where 子句中dp.template_id= @TemplateId and dp.deleted = 0

在此處輸入圖像描述

如果我使用((@TemplateId = 0 or @TemplateId is null) or (dp.template_id= @TemplateId)) and dp.deleted = 0

在此處輸入圖像描述

您是否嘗試將 @TemplateId 設置為外鍵? 並刪除 template_id? 我的意思是,當您可以對照一個值檢查一個變量時,為什么還需要對照兩個值來驗證它呢?

添加OPTION(RECOMPLE)查詢提示。 SQL 服務器然后可以在編譯期間使用常量折疊來評估值並從計划中消除不需要的謂詞。

OPTION(RECOMPLE)的缺點是計划不會被重用,如果查詢以高頻率執行(即每秒多次),這可能是一個問題。 在這種情況下,您可以使用IF構造來根據值執行不同的查詢,而不是單個查詢。 這將緩存兩個計划。

如果您不想檢查 template_id,請不要這樣做:

IF @template_id IS NULL OR @template_id = 0
   SELECT p.id dp.HasWorkouts
   FROM dbo.Plans dp
   WHERE dp.deleted = 0 
ELSE 
   SELECT dp.id ,dp.HasWorkouts
   FROM dbo.Plans dp
   WHERE dp.template_id= @TemplateId and dp.deleted = 0

這實際上是兩個查詢,最好的覆蓋索引是;

CREATE INDEX ix_template_id_is_deleted ON dbo.Plans(template_id, is_deleted)
INCLUDE (id, HasWorkouts)

CREATE INDEX ix_plans_is_deleted ON dbo.Plans(is_deleted)
INCLUDE (id, hasWorkouts)

另一種方法是通過這樣的唯一查詢:

SELECT dp.id, dp.HasWorkouts
FROM dbo.Plans dp
WHERE
   (@template_id = 0 OR @template_id IS NULL OR dp.template_id= @TemplateId) 
   and dp.deleted = 0 
OPTION (RECOMPILE)

但這需要在執行時重新編譯查詢以提高效率。

另一個可能值得嘗試的索引如下:

CREATE INDEX ix_template_not_deleted ON dbo.Plans(template_id)
INCLUDE (id, HasWorkouts)
WHERE is_deleted = 0

我認為測試這個索引是值得的,因為我認為這個索引對於兩個查詢都足夠了,而且它更小。

暫無
暫無

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

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