Sql server 执行插入时索引性能

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

我有一个包含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 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,我已经添加了表和索引模式。另外,大多数时候没有其他应用程序访问此表,所以正如您所提到的,删除索引、执行插入并在插入完成后重新创建索引应该是一种方法。但是,有时我有两个应用程序访问此表。这种情况有什么解决办法吗?我仍然可以删除索引,插入并重新创建索引吗?在我插入时有没有办法锁定这个表?感谢像论坛网站一样,我们不使用“谢谢”或“感谢任何帮助”或签名。顺便说一句,这是“提前感谢”,而不是“提前感谢”。