2017-04-20 81 views
0

我在同一臺服務器的同一個數據庫中製作了一個具有相同索引的表的副本。 然後它在一個表中和另一個表中執行相同的查詢,但執行計劃不同。相同查詢但執行計劃不同,服務器相同

爲什麼?

這是我的查詢:

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 
+4

表中沒有相同的數據。如果他們這樣做,那麼統計可能會有所不同。 –

+1

你可以添加每個表的定義嗎? 'CREATE TABLE ...'也許一張表有一列左右缺少索引... – m13r

+0

這些表有相同的數據,我不明白... – TBP

回答

0

其中一個主要參數,sql server在創建計劃時使用的是統計數據。即使兩個表中的數據相同,統計數據也會不同,導致執行計劃不同

查看統計爲表,您可以使用下面

dbcc show_statistics('SFMatl','AppUpdated') 


dbcc show_statistics('SFMatl','SFMatl_Backup20042017') 

如果你現在,如何推斷上述結果,你就可以看到,統計對以上兩個表,這進一步決定計劃質量不同

1

與這些查詢的主要區別是它們不一樣。
SELECTed表不一樣。

這意味着查詢計劃中有兩件事。
例如,由於數據量不同導致的不同統計量。
不同的索引或索引碎片。

您可以檢查索引及其碎片(如果需要也可以重新組織它們),還可以重新計算統計信息。

如果它仍然保持相同的查詢計劃
那麼差異主要是由於表中包含的數據。

相關問題