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 / 问题 / 306740
Accepted
ahmed elbarbary
ahmed elbarbary
Asked: 2022-01-29 13:03:03 +0800 CST2022-01-29 13:03:03 +0800 CST 2022-01-29 13:03:03 +0800 CST

mslid 上的非集群索引查找速度很慢

  • 772

我在 SQL Server 中遇到了一个问题,即非集群索引查找性能不佳。

下面是实际的执行计划 https://www.brentozar.com/pastetheplan/?id=Sk3-4JGAK

如何提高性能?

下面是表格定义

 CREATE TABLE [Parts].[ManufacturingData](
     [LeadFinishId] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
     [PartID] [int] NOT NULL,
     [LeadFinishMaterial] [varchar](50) NULL,
     [CreatedDate] [datetime] NULL,
     [CreatedBy] [int] NULL,
     [ModifiedDate] [datetime] NULL,
     [Modifiedby] [int] NULL,
     [DeletedDate] [datetime] NULL,
     [DeletedBy] [int] NULL,
     [Revision_Id] [int] NULL,
     [BaseMaterialID] [int] NULL,
     [MSLID] [int] NULL,
     [MSLSource_Revision_id] [int] NULL,
     [MaximumReflowTemperatureID] [int] NULL,
     [ReflowTemperatureSource_Revision_Id] [int] NULL,
     [MaximumWaveTemperatureID] [int] NULL,
     [WaveTemperatureSource_Revision_ID] [int] NULL,
     [ReflowSolderTimeID] [int] NULL,
     [WaveSolderTimeID] [int] NULL,
     [NumberOfReflowCycleID] [int] NULL,
     [LeadFinishPlatingID] [int] NULL,
     [Comment] [varchar](100) NULL,
     [LeadfinishSourceTypeID] [int] NULL,
     [MSlSourceTypeID] [int] NULL,
     [ReflowTemperatureSourceTypeID] [int] NULL,
     [BasedOnID] [int] NULL,
     [LeadFreeProcessCapabilityID] [int] NULL,
     [BaseMaterialRevisionID] [int] NULL,
     [BaseMaterialSourceTypeID] [int] NULL,
     [UnderplatingRevisionID] [int] NULL,
     [UnderplatingSourceTypeID] [int] NULL,
     [ShelfLifeCondition] [int] NULL,
  CONSTRAINT [PK_PartID] PRIMARY KEY CLUSTERED 
 (
     [PartID] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Customer]
 ) ON [Customer]
    
 GO
    
 SET ANSI_PADDING ON
 GO

index seek used as below

 CREATE NONCLUSTERED INDEX [IDX_MSLID] ON [Parts].[ManufacturingData]
 (
     [MSLID] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Customer]
 GO

USE [Z2DataCore]
GO


 ALTER TABLE [Parts].[ManufacturingData] ADD  CONSTRAINT [PK_PartID] PRIMARY KEY CLUSTERED 
 (
     [PartID] ASC
 )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [Customer]
 GO
sql-server sql-server-2016
  • 4 4 个回答
  • 513 Views

4 个回答

  • Voted
  1. J.D.
    2022-01-29T16:26:35+08:002022-01-29T16:26:35+08:00

    我会对您的Parts.ManufacturingData表中的总行数以及您的查询当前的总运行时间感兴趣。执行计划说它返回的行数(大约 3200 万)实际上对您的查询有意义吗?

    也许您会发现过滤索引可以为您节省一点时间,因为它只会预先实现您想要的数据。具有此定义的索引怎么样,有什么区别吗?

    CREATE NONCLUSTERED INDEX IX_ManufacfuringData_MSLID_Filtered ON Parts.ManufacturingData (MSLID) WHERE MSLID IS NOT NULL;
    

    请注意,一旦创建了上述过滤索引,您不需要对查询执行任何不同的操作即可使用它。但是您应该检查执行计划以确保优化器在查询运行时选择这个新索引而不是表上的任何其他索引。

    如果这没有任何区别,您可以尝试的另一件事是将FORCESCAN提示添加到您的查询中,如下所示:

    select  partid,mslid 
    into ExtractReports.dbo.manufactureparts
    from parts.manufacturingdata m with(nolock, FORCESCAN)
    where mslid is  not null
    

    这将告诉优化器使用扫描操作而不是搜索您的数据。如果表中的大部分数据符合您的WHERE子句标准,这通常会更有效。即,在该点扫描整个表并过滤掉不需要的行通常比查找这么多行要快。但是很难说这是否会在不了解您的数据或对其进行测试的情况下对您的情况有所帮助。

    请注意,应谨慎使用查询提示,并且仅在无法使用替代优化方法的情况下使用。某些查询提示限制了优化器可以选择的可用执行计划的数量,因此当使用这些提示的某些查询尝试执行时,可能会引发错误。

    在这种情况下,我认为使用FORCESCAN提示可能没问题,因为您的查询很简单,而且我认为它不会像其他提示那样限制查询计划的数量。

    • 4
  2. MBuschi
    2022-01-30T08:19:31+08:002022-01-30T08:19:31+08:00

    Mybe,您可以尝试在同一文件上使用非聚集列存储索引。这可能会导致批处理模式和压缩,因此您可以在阅读时节省一些东西。

    微软文档

    例子:

    CREATE NONCLUSTERED COLUMNSTORE INDEX 
    [NCCIX_Parts_ManufacturingData_MSLID] ON [Parts].[ManufacturingData]
     (
         [MSLID] ASC
     )
    GO
    
    • 2
  3. Brendan McCaffrey
    2022-01-29T14:00:31+08:002022-01-29T14:00:31+08:00

    您的索引搜索返回 3200 万行。你有一个很好的计划,只是需要阅读大量数据。

    您可以考虑在尝试插入目标表之前显式创建目标表。

    • 1
  4. Best Answer
    Learning_DBAdmin
    2022-01-31T02:49:34+08:002022-01-31T02:49:34+08:00

    除了其他正确答案之外,您还可以尝试另一种方法来提高性能,这可能是创建索引视图,如下所示:

    CREATE VIEW parts.manufacturingdata_Indexed
    WITH SCHEMABINDING AS
    select partid,mslid from parts.manufacturingdata m with(nolock)
    where mslid is  not null
    

    创建上述视图后,创建索引如下:

    CREATE UNIQUE CLUSTERED INDEX IX_manufacturingdata
        ON parts.manufacturingdata_Indexed
         (partid,mslid);
    

    创建上述视图和索引后,您可以将查询重写为:

    insert into ExtractReports.dbo.manufactureparts
    (select * from parts.manufacturingdata_Indexed)
    

    我将查询更改为insert into而不是select * into代码的可重用性。在 的情况下select into,您总是需要删除基础表。

    请让我们知道这是否有帮助。

    • 1

相关问题

  • 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