在具有大量空nvarchar列的表上缓慢插入性能

问题描述 投票:0回答:3

我有一个150列的表。他们中的大多数是nvarchar(100) null类型,有些是decimal(20,7) null

例:

Create table myTable
(
     ID bigint (PK),
     Col1 Nvarchar(100) null,
     Col2 Nvarchar(100) null,
     Col3 Nvarchar(100) null,
     ....
     Col150 nvarchar(100) null
)

当我插入时,我只插入20列。当我尝试插入1或2百万条记录时,需要花费很多时间(> 32gb ram> 1分钟)

当我将相同数量的记录插入临时表时,只需1-2秒。

Clustered index insert

我也尝试删除主键但结果是一样的。如何加速插入具有大量空nvarchar列的表?

sql-server sql-server-2016
3个回答
0
投票

由于你有很多空列我建议使用XML作为列类型,如果可能的话创建表myTable(ID bigint(PK),Col1 XML)

这将在您解释的情况下提高您的表现。由于使用xml是一个更大的主题,你可以阅读更多here


0
投票

说到设计,这显然不是最好的做法,有数百个可以为空的列,大多数时候都是空的。

所以,我可以说:

如果您可以重新设计表格,您可以:

  1. 使用一个XML列存储所有可以为空的列(如@seesharpguru所述)
  2. 将所有这些列转换为单独表中的行
  3. 使用空字符串而不是NULL值,因此您可以将所有列设置为NOT NULLABLE

如果您没有任何选择,您可以:

  1. 使用BULK INSERT
  2. 等到完成,让我们希望用户可以使用SLA ;-)

我确信那里有很多选择,但至少我之前已经完成了所有这些解决方案。

对不起,我不能给你更多的想法。


0
投票

您可能会遇到大量页面拆分。可通过监控(Profiler或DMV)确认。

每个表的列数太多。要求:

  • 重新设计表(规范化或拆分 - 具有40列的4个表比具有150列的1个表快得多)
  • 尝试对表格进行碎片整理
  • 尝试不同的fillfactor
© www.soinside.com 2019 - 2024. All rights reserved.