簡體   English   中英

將索引掃描轉換為索引查找

[英]Turn index scan to an index seek

我已向表添加索引以停止表掃描。 現在它掃描的是索引而不是表,為什么它不執行索引查找?

CREATE PROCEDURE [dbo].[GetPeople]
(
    @PlaceIDs [dbo].[Integers] READONLY,
    @RoleGroupIDs [dbo].[Integers] READONLY
)

AS
BEGIN
    SET NOCOUNT ON;
    SELECT
        PTS.PersonToSiteID,
        PTS.SiteID,
        PTS.PersonID,
        P.PersonID,
        P.GivenName,
        P.FamilyName,
        P.Email,
        P.LandlineNumber,
        P.MobileNumber,
        R.RoleTypeID
    FROM 
        [dbo].[PeopleToPlaces] PTS
        INNER JOIN (Select DISTINCT Identifier FROM @PlaceIDs) Pl ON PTS.PlaceID = Pl.Identifier
        INNER JOIN [dbo].[People] P ON P.PeopleID = PTS.PeopleID 
        INNER JOIN [dbo].[Role] R ON R.RoleID = P.RoleID
        INNER JOIN (Select DISTINCT Identifier FROM @RoleGroupIDs) RG ON R.RoleGroupID = RG.Identifier
END

我在 People 表上有一個覆蓋索引,並在測試時添加了 Distinct 子查詢。 有一個索引覆蓋了 PTS 表的連接和 UDT 中的 Identifier 字段都是與它們連接的類型匹配的整數。 與 JOIN 相比,我還嘗試了 SELECT IN 並且找不到避免索引掃描的方法

到目前為止將此用作資源 - https://www.red-gate.com/simple-talk/sql/performance/identifying-and-solving-index-scan-problems/

您的查詢沒有WHERE過濾子句; 它要求該大連接的結果集中的所有記錄。

如果您只需要結果集中的一個或非常少的行,查詢計划器將選擇索引搜索而不是索引掃描 索引掃描是一個兩步過程:首先它尋找它需要的第一行(可能是索引中的第一行)。 然后它依次掃描索引以獲取所需行的 rest。

掃描覆蓋索引是獲取多行結果集的有效方法:可以從索引中滿足查詢,因此查詢計划器不必在索引和表數據本身之間來回切換。

一切都很好。

暫無
暫無

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

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