Sql server 执行插入时索引性能
我有一个包含4列的表,该表上有3个索引:Sql server 执行插入时索引性能,sql-server,tsql,indexing,Sql Server,Tsql,Indexing,我有一个包含4列的表,该表上有3个索引: CREATE TABLE [dbo].CustomerInfo( ID [int] IDENTITY(1,1) NOT NULL, UserHashID [varchar](20) NOT NULL, ShippingID [int] NOT NULL, Received [bit] NOT NULL, CONSTRAINT [PK_ID] PRIMARY KEY CLUST
CREATE TABLE [dbo].CustomerInfo(
ID [int] IDENTITY(1,1) NOT NULL,
UserHashID [varchar](20) NOT NULL,
ShippingID [int] NOT NULL,
Received [bit] NOT NULL,
CONSTRAINT [PK_ID] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_ShippingID] ON [dbo].[CustomerInfo] ( [ShippingID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashID] ON [dbo].[CustomerInfo] ( [UserHashID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashIDShippingID] ON [dbo].[CustomerInfo] ( [UserHashID] ASC, [ShippingID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
我插入了大约400-500万条记录,这个过程大约需要45分钟。我意识到,如果我删除索引,插入速度会快得多(2-3分钟)
想知道删除索引、执行插入以及在插入完成后重建索引是否有任何副作用。与启用索引时的45分钟相比,整个过程可能需要5分钟。否,删除索引、执行插入并在插入后重新构建索引不会产生任何副作用(假设在执行插入时无需访问表) 这是很常见的模式 [总而言之,我对一个有4列和3个索引的表的时差感到惊讶。你能发布你的模式和索引定义吗] 正如@PJ8912所指出的,根据备份事务日志的频率,事务日志记录可能会有所不同 更新:不相关,但此索引
CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashID]
ON [dbo].[CustomerInfo] ([UserHashID] ASC)
是冗余的,因为它包含在此索引中:
CREATE NONCLUSTERED INDEX [IDX_CustomerInfo_UserHashIDShippingID]
ON [dbo].[CustomerInfo] ([UserHashID] ASC, [ShippingID] ASC)
根据事务日志记录的级别,TLOG可能会定期重新创建索引。如果截断索引以消除它们,则不会记录该操作
创建新索引后,执行计划的统计信息可能不是最新的。您可能希望使用完全扫描模式更新统计信息。“创建新索引后,执行计划的统计信息可能不是最新的”-我不确定这是否正确。可能是我绘图太快了(但统计信息可能有不同的设置)。我的建议是,看看性能是否是一个问题,看看TLOG是否会很快变大。我确实认为删除和创建索引是一个很好的做法。在大量插入低于统计信息更新阈值之后,统计信息可能不是最新的。谢谢PJ8912。我将检查事务日志的设置。Mitch,我已经添加了表和索引模式。另外,大多数时候没有其他应用程序访问此表,所以正如您所提到的,删除索引、执行插入并在插入完成后重新创建索引应该是一种方法。但是,有时我有两个应用程序访问此表。这种情况有什么解决办法吗?我仍然可以删除索引,插入并重新创建索引吗?在我插入时有没有办法锁定这个表?感谢像论坛网站一样,我们不使用“谢谢”或“感谢任何帮助”或签名。顺便说一句,这是“提前感谢”,而不是“提前感谢”。