【问题标题】:How to optimize SQL Server table with 320 million + rows with only varchar(max) data types如何优化只有 varchar(max) 数据类型的 3.2 亿 + 行的 SQL Server 表
【发布时间】:2019-05-27 09:58:26
【问题描述】:

我有一个包含 3.2 亿多行和 34 列的表,所有数据类型均为 varchar(max),并且没有索引。

我发现总结整个表格非常耗时。考虑到我需要使用它的以下目的,任何人都可以建议优化它的最佳方法:

  • 简单的选择查询
  • 几列的总和

我应该在我添加的顺序行号列上创建一个非聚集索引吗?

我在磁盘上的表大小约为 185 GB

我正在使用

  • Windows Server 2008 R2
  • 至强处理器 2.09 x 2
  • 16 GB 内存
  • SQL Server 2008 R2

由于数据没有唯一的列,所以我已经添加了一个整数序列,需要 2 天才能完成操作。

【问题讨论】:

  • 首先修复数据类型。为什么所有 34 列都是 varchar(max)?你想做 SUM 运算,所以必须有一些应该是数字的
  • 每条记录平均为 578 字节,因此即使有任何列实际上需要 MAX,即使它们是字符串,也可能很少。
  • 实际上,数据是通过批量插入从超过 1600 万个固定长度文件中加载的非 xml 格式文件。为了确保所有数据都能正确加载,我使用了 varchar(max) 类型。
  • 所以这最多应该用于分期。然后将其加载到具有健全架构和索引的表中以进行操作查询。 varchar(max) 无法被索引
  • @ShahbazKhan,我建议在加载到数据库之前修剪空格。您还可以在 ETL 过程中执行其他转换和验证,而不是 ELT。

标签: sql-server sql-server-2008-r2 large-data database-optimization


【解决方案1】:
  1. 使用合适的数据类型创建新表。这是最重要的部分 - 为列定义类型。 nvarchar(max) 是最常见的类型,所以无法优化。对数字使用 intbigint,使用 nvarchar(N) 其中 N - 最大长度。使用bit 表示布尔值,等等
  2. 为搜索创建主键、索引
  3. 将旧表中的数据复制到包含 10000 或 100000 行部分的新表中。

【讨论】:

  • 感谢您的帮助。将数据加载到另一个表并完成数据转换需要 16 个小时。
猜你喜欢
  • 2011-11-24
  • 2013-11-12
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-17
相关资源
最近更新 更多