Sql-Server

聚集索引的順序是否與搜尋時的非聚集索引具有相同的約束?

  • April 6, 2020

我有一個充滿一堆數據的表,我想使用以下聚集索引:

[account_id, group_id, run_id, page_id, date]

對於非聚集索引,如果我要使用涉及account_idpage_id和的 WHERE 過濾器date_time,我知道該索引將不起作用,因為我不包括group_idand run_id。使用聚集索引時是否同樣適用?我經常想以如下形式進行查詢:

SELECT * 
FROM my_table
WHERE ad_account_id = %d
 AND page_id = %d
 AND date >= DATE(%s)
 AND date <= DATE(%s)

但有時我會遇到以下問題:

SELECT * 
FROM my_table
WHERE ad_account_id = %d
 AND group_id = %d
 AND date >= DATE(%s)
 AND date <= DATE(%s)

或者

SELECT * 
FROM my_table
WHERE ad_account_id = %d
 AND group_id = %d
 AND run_id = %d
 AND date >= DATE(%s)
 AND date <= DATE(%s)

尚不清楚這些是否利用了超過給出的聚集索引account_id(我很確定這不是在進行全表掃描,但即使在那裡也不確定)。

只是從左到右思考,直到你遇到一個差距。

對於第一季度,SQL Server 可以搜尋 ad_account_id(假設它在索引中並且您在索引定義中有錯字),然後掃描具有該值的那些。

對於 Q2,SQL server 可以搜尋 ad_account_id 和 group_id 然後掃描它們。

對於 Q3,SQL Server 可以查找 WHERE 子句中的所有列。

所以,是的,相同的原則適用於聚集索引和非聚集索引。

引用自:https://dba.stackexchange.com/questions/264382