AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 260705
Accepted
Evan Barke
Evan Barke
Asked: 2020-02-28 00:52:01 +0800 CST2020-02-28 00:52:01 +0800 CST 2020-02-28 00:52:01 +0800 CST

创建覆盖索引后仍在进行键查找

  • 772

我已经实现了一个覆盖索引来避免键查找:

CREATE INDEX IX_StatusHistory_Covering ON StatusHistory(ID) 
       INCLUDE (Status_ID, StatusComment, StatusReason_ID,
       StatusReasonComment, UserEnteredStatusDateTime, 
       ChangeDateTime, ChangedBy_UserName, IMWBWagonMass) 
       WITH (ONLINE= ON)

但是密钥查找仍在进行中。

键查找

执行计划

这是导致此问题的查询:

DECLARE @default_tare DECIMAL(18,2) = 19.94
SELECT      TOP 100  *,         
        [Gross (WI)] -  ISNULL([Tare (WX)],@default_tare) AS [Arrived Nett (WI-WX)],
        [Gross (WN)] - ISNULL([Tare (WT)],@default_tare) AS  [Tipped Nett (WN-WT)],         
        [Client Weight] - ([Gross (WI)] -  ISNULL([Tare (WX)],@default_tare)) AS [Arrived Variance],            
        [Client Weight] - ([Gross (WN)] - ISNULL([Tare (WT)],@default_tare)) AS [Tipped Variance]

FROM        (SELECT     CASE WHEN LoadedWeight > 9999 THEN LoadedWeight/1000 ELSE LoadedWeight END [Client Weight]
                    ,CASE WHEN his.Status_Code IN ('WH','WI') THEN his.IMWBWagonMass END AS [Gross (WI)]
                    ,CASE WHEN his.Status_Code ='WN' THEN his.IMWBWagonMass END AS [Gross (WN)]
                    ,CASE WHEN his.Status_Code = 'WX' THEN his.[IMWBWagonMass] ELSE NULL END AS [Tare (WX)]                 
                    ,CASE WHEN his.Status_Code = 'WT' THEN his.[IMWBWagonMass] ELSE NULL END AS [Tare (WT)]
                    ,dp.Description AS Commodity
                    ,dp.Grade                       
                    ,Header_Client_Name AS Client
                    ,Header_Destination_Name AS Destination
                    ,Header_Origin_Name AS Origin
                    ,Header_Product_Name AS [Commodity Name]
                    ,Header_ProductSubCategory_Name AS [Commodity Group]
                    ,his.StatusComment AS [Status Comment]
                    ,LEFT(LOWER(Rcd.Header_LastUpdatedByUser_UserName),CASE WHEN Header_LastUpdatedByUser_UserName <>'System' THEN CHARINDEX( '@',Rcd.Header_LastUpdatedByUser_UserName)-1 ELSE 999 END) AS [Last updated by]
                    ,ISNULL(Header_StatusDateTime, Header_CreatedDateTime) AS [Last Updated]
                    ,st.Name  AS [Status Name]
                    ,StatusReasonComment AS [Reason Comment]
                    ,StatusReasonName AS [Reason Name]
                    ,UserEnteredStatusDateTime AS [Status Actual Event Time]
                    ,ChangeDateTime AS [Status System Change Time]
                    ,ChangedBy_UserName AS [Status Changed by]
                    ,st.Code  AS [Status Code]
                    ,sr.Code AS [Reason Code]
                    ,his.ID AS [Status History ID]
                    ,his.StatusReasonDateTime  AS [Reason Time]
                    ,his.IMWBWagonMass AS [Wagon Status History Mass]
                    ,rcd.ID AS [Wagon Line ID]
                    ,Wagon_Number AS [Wagon Number]
                    ,GrossWeight AS [Gross (Most Recent)]
                    ,TareWeight AS [Tare (Most Recent)]
                    ,Tarps
                    ,DelayDescription AS [Delay Description]
                    ,rcd.StatusComment AS [Current Wagon Status Comment]
                    ,rcd.StatusDateTime AS [Current Wagon Status Date Time]
                    ,rcd.Status_Code AS [Current Wagon Status Code]
                    ,rcd.Status_Name AS [Current Wagon Status]
                    ,RailConsignment_ID
                    ,Header_Number AS [Consignment]
                    ,Header_DepartureFromClientDateTime AS [Departure Time]
                    ,Header_EstimatedArrivalDateTime AS [Estimated Arrival Time]
                    ,Header_IsInbound
                    ,Header_PermitNumber AS [Permit Nr]
                    ,Header_RailAccountNumber AS [Rail Account Nr]
                    ,Header_Sender_Name AS [Sender]
                    ,Header_SenderSidingNumber AS [Sender Siding Nr]
                    ,Header_Status_Code AS [Train Current Status Code]
                    ,Header_Status_Name AS [Train Current Status]
                    ,Header_StatusDateTime AS [Train Current Status Actual Event Time]
                    ,Header_Train AS [Train]
                    ,Header_CreatedDateTime AS [Created On]
                    ,rcd.dw_timestamp
                    ,CreatedDateTime AS [Wagon Created On]
                    ,Header_Contract_Number AS [Contract Nr]
                    ,rcd.IMWBWagonMass AS [Wagon Mass (Most Recent)]
                    ,Header_WeeklyRailPlan_ID AS [NWB ID]
                    ,NettWeight AS [Nett (Most Recent)]
                    ,CASE WHEN rcd.Status_Code = 'WA' THEN rcd.Header_StatusDateTime ELSE Header_WAChangeDateTime END AS [Wagons Uncoupled From Locomotive]
                    ,CASE WHEN rcd.Status_Code = 'WF' THEN rcd.Header_StatusDateTime ELSE Header_WFChangeDateTime END AS [Consignment Finalised]
                    ,CASE WHEN rcd.Status_Code = 'WG' THEN rcd.Header_StatusDateTime ELSE Header_WGChangeDateTime END AS [Consignment at the Gate]
        FROM        RailConsignmentDetails AS  rcd WITH(NOLOCK)
        JOIN        FullStatusHistoryRailLine AS his WITH(NOLOCK) on his.ID = rcd.ID
        JOIN        DimProduct AS dp WITH(NOLOCK) ON dp.ID = rcd.Header_Product_ID
        LEFT JOIN   DimConsignmentStatus AS st  WITH(NOLOCK)ON st.ID = his.Status_ID
        LEFT JOIN   DimStatusReasons   AS sr WITH(NOLOCK)  ON st.ID = his.StatusReason_ID
        WHERE       Header_Deleted = 0
        AND         rcd.Deleted = 0
        AND         ISNULL(Header_StatusDateTime, Header_CreatedDateTime) BETWEEN CAST(DATEADD(MONTH,-2,GETDATE()) AS DATE) AND GETDATE()+ 1) AS t

FullStatusHistoryLine 视图是:

CREATE VIEW [dbo].[FullStatusHistoryRailLine]
    AS
        SELECT      sh.PK,
                    sh.ID,
                    CAST(sh.Number AS VARCHAR(255)) AS Number,
                    sh.Status_ID,
                    sh.Status_Name,
                    sh.StatusComment,
                    sh.StatusReason_ID,
                    sh.StatusReasonComment,
                    dsr.Name AS StatusReasonName,
                    sh.UserEnteredStatusDateTime,
                    sh.ChangeDateTime,
                    sh.ChangedBy_Id,
                    sh.ChangedBy_UserName,
                    sh.dw_timestamp,
                    dcs.code AS Status_Code,
                    sh.StatusReason_Code,                       
                    prev.StatusReasonDateTime AS FromStatusReasonDateTime,
                    sh.StatusReasonDateTime,
                    sh.IMWBWagonMass
        FROM        StatusHistory AS sh
        INNER JOIN  DimConsignmentStatus AS dcs ON sh.Status_ID = dcs.ID
        LEFT JOIN   DimStatusReasons AS dsr ON dsr.ID = sh.StatusReason_ID
        OUTER APPLY (SELECT TOP 1 StatusReasonDateTime 
                    FROM    StatusHistory
                    WHERE   ID = sh.ID
                    AND     Number = sh.Number
                    AND     IsHeader = sh.IsHeader
                    AND     TransportMode_Name = sh.TransportMode_Name
                    AND     StatusReasonDateTime < sh.StatusReasonDateTime
                    ORDER BY StatusReasonDateTime DESC) AS prev
        WHERE       sh.TransportMode_Name = 'Rail'
        AND         sh.IsHeader = 0
        UNION ALL
        SELECT      CAST(rcd.ID AS VARCHAR) + '_' + CAST(ISNULL(CONVERT(VARCHAR(64),rcd.StatusReasonDateTime,126),CONVERT(VARCHAR(64),rcd.LastUpdatedDateTime,126)) AS VARCHAR) + '_L' AS PK,
                    rcd.ID,
                    CAST(rcd.Wagon_Number AS VARCHAR(255)) AS Number,
                    rcd.Status_ID,
                    rcd.Status_Name,
                    rcd.StatusComment,
                    rcd.StatusReason_ID,
                    '' AS StatusReasonComment,
                    rcd.StatusReason_Name AS StatusReasonName,
                    rcd.StatusDateTime AS UserEnteredStatusDateTime,
                    rcd.StatusSavedDateTime AS ChangeDateTime,
                    rcd.LastUpdatedByUser_Id AS ChangedBy_Id,
                    rcd.LastUpdatedByUser_UserName AS ChangedBy_UserName,
                    rcd.dw_timestamp,
                    rcd.Status_Code,
                    rcd.StatusReason_Code,
                    prev.StatusReasonDateTime AS FromStatusReasonDateTime,
                    rcd.StatusReasonDateTime,
                    rcd.IMWBWagonMass
        FROM        RailConsignmentDetails AS rcd
        OUTER APPLY (SELECT TOP 1 StatusReasonDateTime 
                    FROM    StatusHistory AS sh
                    WHERE   sh.ID = rcd.ID
                    AND     Number =  CAST(rcd.Wagon_Number AS VARCHAR(255))
                    AND     IsHeader = 0
                    AND     TransportMode_Name = 'Rail'
                    AND     StatusReasonDateTime < rcd.Header_StatusReasonDateTime
                    ORDER BY StatusReasonDateTime DESC) AS prev

最后是 DDL:

CREATE TABLE [dbo].[StatusHistory](
[PK] [varchar](99) NOT NULL,
[ID] [int] NOT NULL,
[Number] [varchar](255) NULL,
[Status_ID] [int] NULL,
[Status_Name] [nvarchar](max) NOT NULL,
[StatusComment] [varchar](255) NULL,
[StatusReason_ID] [int] NULL,
[StatusReasonComment] [varchar](255) NULL,
[UserEnteredStatusDateTime] [datetime] NULL,
[ChangeDateTime] [datetime] NULL,
[ChangedBy_Id] [nvarchar](128) NOT NULL,
[ChangedBy_UserName] [nvarchar](256) NOT NULL,
[IsHeader] [bit] NOT NULL,
[dw_timestamp] [datetime] NOT NULL,
[EventTime] [datetime] NOT NULL,
[StatusReason_Code] [nvarchar](max) NULL,
[StatusReasonDateTime] [datetime] NULL,
[TransportMode_Name] [varchar](5) NULL,
[IMWBWagonMass] [decimal](18, 2) NULL,
[RoadFirstWeight] [decimal](18, 2) NULL,
[RoadSecondWeight] [decimal](18, 2) NULL,
[DraftSurveyTons] [decimal](18, 2) NULL,
[StatusHistory_key] [int] IDENTITY(1,1) NOT NULL,
CONSTRAINT [XPK_StatusHistory] PRIMARY KEY CLUSTERED 
(
[StatusHistory_key] ASC
)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
sql-server bookmark-lookup
  • 1 1 个回答
  • 102 Views

1 个回答

  • Voted
  1. Best Answer
    Denis Rubashkin
    2020-02-28T05:04:15+08:002020-02-28T05:04:15+08:00

    看看 Seek Predicate on StatusHistory:

    搜索谓词搜索键[1]:前缀:

    [GrindrodTerminalsDW].[dbo].[StatusHistory].ID,

    [GrindrodTerminalsDW].[dbo].[StatusHistory].TransportMode_Name,

    [GrindrodTerminalsDW].[dbo].[StatusHistory].IsHeader

    标量运算符([GrindrodTerminalsDW].[dbo].[RailConsignmentDetails].[ID] as [rcd].[ID]),标量运算符('Rail'),标量运算符((0))

    您必须将 TransportMode_Name 和 IsHeader 列添加到新索引中,以便它真正覆盖:

    CREATE INDEX IX_StatusHistory_Covering ON StatusHistory
    (ID, TransportMode_Name, IsHeader) 
    INCLUDE (Status_ID, StatusComment, StatusReason_ID,
           StatusReasonComment, UserEnteredStatusDateTime, 
           ChangeDateTime, ChangedBy_UserName, IMWBWagonMass) 
    WITH (ONLINE= ON)
    
    • 2

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve