在具有大量空nvarchar列

时间:2018-03-01 22:42:50

标签: sql-server sql-server-2016

我有一个包含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列的表格?

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

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

所以,我可以说:

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

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

    1. 使用BULK INSERT
    2. 等到完成后,让我们希望用户可以使用SLA; - )
    3. 我确信有很多选择,但至少我之前已经完成了所有这些解决方案。

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

答案 2 :(得分:0)

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

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

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