【问题标题】:Same query but different execution plans, same server相同的查询但不同的执行计划,相同的服务器
【发布时间】:2023-03-09 07:46:02
【问题描述】:

我在同一服务器的同一数据库中复制了具有相同索引的表。 然后它在一个表和另一个表中执行相同的查询,但执行计划不同。

为什么?

这些是我的疑问:

select top 1 * from SFMatl
where AppUpdated = 0 and UpdLock = 0 and CompanyId = 'ent'
order by recid

select top 1 * from SFMatl_Backup20042017
where AppUpdated = 0 and UpdLock = 0 and CompanyId = 'ent'
order by recid

还有这些执行计划:

Query1

Query2

我的创建表:

/****** Object:  Table [dbo].[SFMatl_Backup20042017]    Script Date: 20/04/2017 14:40:33 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[SFMatl_Backup20042017](
    [RecId] [int] NOT NULL,
    [CompanyId] [char](3) NOT NULL,
    [PrOdId] [varchar](10) NOT NULL,
    [OprNum] [tinyint] NOT NULL,
    [WrkCtrId] [varchar](10) NOT NULL,
    [ItemId] [varchar](20) NOT NULL,
    [SizeId] [varchar](20) NOT NULL,
    [SizeId2] [varchar](20) NOT NULL,
    [ColorId] [varchar](20) NOT NULL,
    [MatlPropId] [varchar](8) NOT NULL,
    [LineNum] [tinyint] NOT NULL,
    [SubForLineNum] [tinyint] NOT NULL,
    [SerialNum] [varchar](20) NOT NULL,
    [PalletNum] [varchar](20) NOT NULL,
    [BatchNum] [varchar](20) NOT NULL,
    [PQty] [numeric](28, 12) NOT NULL,
    [PUnit] [varchar](10) NOT NULL,
    [SQty] [numeric](28, 12) NOT NULL,
    [SUnit] [varchar](10) NOT NULL,
    [TQty] [numeric](28, 12) NOT NULL,
    [TUnit] [varchar](10) NOT NULL,
    [StkQty] [numeric](28, 12) NOT NULL,
    [StkUnit] [varchar](10) NOT NULL,
    [FtQty] [numeric](28, 12) NOT NULL,
    [LbQty] [numeric](28, 12) NOT NULL,
    [MQty] [numeric](28, 12) NOT NULL,
    [KgQty] [numeric](28, 12) NOT NULL,
    [Yield] [numeric](28, 12) NOT NULL,
    [YieldUnit] [varchar](10) NOT NULL,
    [WPQty] [numeric](28, 12) NOT NULL,
    [WPUnit] [varchar](10) NOT NULL,
    [WSQty] [numeric](28, 12) NOT NULL,
    [WSUnit] [varchar](10) NOT NULL,
    [SetNum] [int] NOT NULL,
    [LaneNum] [tinyint] NOT NULL,
    [RowNum] [smallint] NOT NULL,
    [TranType] [varchar](10) NOT NULL,
    [WasteId] [varchar](10) NOT NULL,
    [Shift] [varchar](10) NOT NULL,
    [ShiftTime] [datetime] NOT NULL,
    [ShiftDate] [datetime] NOT NULL,
    [PRGCode] [varchar](10) NOT NULL,
    [UserRemark] [text] NOT NULL,
    [JobType] [varchar](10) NOT NULL,
    [WareHouseId] [varchar](10) NOT NULL,
    [LocationId] [varchar](10) NOT NULL,
    [AppUpdated] [tinyint] NOT NULL,
    [OnOffUpdated] [tinyint] NOT NULL,
    [InventTransId] [varchar](20) NOT NULL,
    [OrgSerialNum] [varchar](100) NOT NULL,
    [ReworkFlag] [tinyint] NOT NULL,
    [Reworked] [tinyint] NOT NULL,
    [Category] [varchar](50) NOT NULL,
    [GroupTranNum] [varchar](10) NOT NULL,
    [SystemCreated] [tinyint] NOT NULL,
    [OfflineTran] [tinyint] NOT NULL,
    [UpdLock] [tinyint] NOT NULL,
    [UpdLockTime] [datetime] NOT NULL,
    [SFBOMRevision] [int] NOT NULL,
    [UDF01] [varchar](50) NOT NULL,
    [UDF02] [varchar](50) NOT NULL,
    [AddEdit] [tinyint] NOT NULL,
    [CalcGauge] [numeric](28, 12) NOT NULL,
    [MasterSerial] [varchar](100) NOT NULL,
    [OprSerialCount] [smallint] NOT NULL,
    [QACheck] [tinyint] NOT NULL,
    [SpliceCount] [tinyint] NOT NULL,
    [NumAcross] [tinyint] NOT NULL,
    [PermitNum] [int] NOT NULL,
    [TransAs] [char](1) NOT NULL,
    [CreateTime] [datetime] NOT NULL,
    [ModifyTime] [datetime] NOT NULL,
    [OSUser] [varchar](20) NOT NULL,
    [ComputerName] [varchar](40) NOT NULL,
    [Reassign] [tinyint] NOT NULL,
    [Reassigned] [tinyint] NOT NULL,
    [OprCode] [varchar](10) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

/****** Object:  Table [dbo].[SFMatl]    Script Date: 20/04/2017 14:40:03 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[SFMatl](
    [RecId] [int] IDENTITY(1,1) NOT NULL,
    [CompanyId] [char](3) NOT NULL,
    [PrOdId] [varchar](10) NOT NULL,
    [OprNum] [tinyint] NOT NULL,
    [WrkCtrId] [varchar](10) NOT NULL,
    [ItemId] [varchar](20) NOT NULL,
    [SizeId] [varchar](20) NOT NULL,
    [SizeId2] [varchar](20) NOT NULL,
    [ColorId] [varchar](20) NOT NULL,
    [MatlPropId] [varchar](8) NOT NULL,
    [LineNum] [tinyint] NOT NULL,
    [SubForLineNum] [tinyint] NOT NULL,
    [SerialNum] [varchar](20) NOT NULL,
    [PalletNum] [varchar](20) NOT NULL,
    [BatchNum] [varchar](20) NOT NULL,
    [PQty] [numeric](28, 12) NOT NULL,
    [PUnit] [varchar](10) NOT NULL,
    [SQty] [numeric](28, 12) NOT NULL,
    [SUnit] [varchar](10) NOT NULL,
    [TQty] [numeric](28, 12) NOT NULL,
    [TUnit] [varchar](10) NOT NULL,
    [StkQty] [numeric](28, 12) NOT NULL,
    [StkUnit] [varchar](10) NOT NULL,
    [FtQty] [numeric](28, 12) NOT NULL,
    [LbQty] [numeric](28, 12) NOT NULL,
    [MQty] [numeric](28, 12) NOT NULL,
    [KgQty] [numeric](28, 12) NOT NULL,
    [Yield] [numeric](28, 12) NOT NULL,
    [YieldUnit] [varchar](10) NOT NULL,
    [WPQty] [numeric](28, 12) NOT NULL,
    [WPUnit] [varchar](10) NOT NULL,
    [WSQty] [numeric](28, 12) NOT NULL,
    [WSUnit] [varchar](10) NOT NULL,
    [SetNum] [int] NOT NULL,
    [LaneNum] [tinyint] NOT NULL,
    [RowNum] [smallint] NOT NULL,
    [TranType] [varchar](10) NOT NULL,
    [WasteId] [varchar](10) NOT NULL,
    [Shift] [varchar](10) NOT NULL,
    [ShiftTime] [datetime] NOT NULL,
    [ShiftDate] [datetime] NOT NULL,
    [PRGCode] [varchar](10) NOT NULL,
    [UserRemark] [text] NOT NULL,
    [JobType] [varchar](10) NOT NULL,
    [WareHouseId] [varchar](10) NOT NULL,
    [LocationId] [varchar](10) NOT NULL,
    [AppUpdated] [tinyint] NOT NULL,
    [OnOffUpdated] [tinyint] NOT NULL,
    [InventTransId] [varchar](20) NOT NULL,
    [OrgSerialNum] [varchar](100) NOT NULL,
    [ReworkFlag] [tinyint] NOT NULL,
    [Reworked] [tinyint] NOT NULL,
    [Category] [varchar](50) NOT NULL,
    [GroupTranNum] [varchar](10) NOT NULL,
    [SystemCreated] [tinyint] NOT NULL,
    [OfflineTran] [tinyint] NOT NULL,
    [UpdLock] [tinyint] NOT NULL,
    [UpdLockTime] [datetime] NOT NULL,
    [SFBOMRevision] [int] NOT NULL,
    [UDF01] [varchar](50) NOT NULL,
    [UDF02] [varchar](50) NOT NULL,
    [AddEdit] [tinyint] NOT NULL,
    [CalcGauge] [numeric](28, 12) NOT NULL,
    [MasterSerial] [varchar](100) NOT NULL,
    [OprSerialCount] [smallint] NOT NULL,
    [QACheck] [tinyint] NOT NULL,
    [SpliceCount] [tinyint] NOT NULL,
    [NumAcross] [tinyint] NOT NULL,
    [PermitNum] [int] NOT NULL,
    [TransAs] [char](1) NOT NULL,
    [CreateTime] [datetime] NOT NULL,
    [ModifyTime] [datetime] NOT NULL,
    [OSUser] [varchar](20) NOT NULL,
    [ComputerName] [varchar](40) NOT NULL,
    [Reassign] [tinyint] NOT NULL,
    [Reassigned] [tinyint] NOT NULL,
    [OprCode] [varchar](10) NOT NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

【问题讨论】:

  • 这些表没有相同的数据。如果是这样,那么统计数据可能会有所不同。
  • 能否添加每个表的定义? CREATE TABLE ... 也许一个表的某列左右缺少索引...
  • 表格有相同的数据,我不明白...
  • 我只是把每个表的定义放了
  • 两个表的索引是否相同?

标签: sql sql-server


【解决方案1】:

这些查询的主要区别在于它们不一样。
SELECTed 的表不一样。

这在查询计划方面意味着两件事。
例如,由于数据量不同而导致的统计数据不同。
不同的索引或索引碎片。

您可以检查索引及其碎片(如果需要,还可以重建/重组它们),还可以重新计算统计信息。

如果它仍然保持相同的查询计划,
那么差异主要是由于表中包含的数据。

【讨论】:

    【解决方案2】:

    sql server 在创建计划时使用的主要参数之一是统计信息。因此即使您拥有的两个表中的数据相同,统计信息也会不同,从而导致执行计划不同

    要查看表格的统计信息,您可以使用下面

     dbcc show_statistics('SFMatl','AppUpdated')
    
    
     dbcc show_statistics('SFMatl','SFMatl_Backup20042017')
    

    如果你现在,如何推断上面的结果,你会看到,上面两张表的统计数据是不同的,这进一步决定了计划的质量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 2018-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      相关资源
      最近更新 更多