开发人员和 DBA 上周就开发人员在我们的 OLTP 环境中使用 VARCHAR、Datetime 和 float 组合创建的包含 400 多个列的一组表进行了讨论。当被问及这种非规范化表的原因时,我们被告知供应商是如何提供记录集的,因此必须以这种方式设计映射表。此外,表将用于跨其他规范化表的交叉连接,并且表可能会增长到更大的大小。目前在同一数据库中很少有具有类似设计且平均 300 万行或更多行的表(具有 375 列)。这些现有的非规范化表按日期分区。这些现有表没有性能问题,因为它们尚未被大量使用。
问题:
- 除了说这是一个糟糕的设计之外,您是否看到这种设计有任何明显的问题可以说服开发人员在规范化环境中重新考虑他们的设计策略。当然,规范化与非规范化各有利弊。
- 根据您的经验,您是否发现此类列式表有任何常见的实时性能问题,例如锁定、DML 需要更长的时间等?如果 SQL Server 出现任何性能问题,开发人员甚至提到考虑将 MongoDB 作为他们的替代方案。
- 如果在 OLTP 中更频繁地设计此类表,您是否会遇到一些可能发生的高级性能问题。请注意,如果需要解决任何 IO 或 CPU 问题,公司可以灵活地添加 CPU 或内存。
我知道在 SQL 2012 中,有列存储索引,但还没有探索过。
需要提出的一些问题:
对于 OLTP,在那么宽的表中插入会非常慢
重复冗余信息会浪费大量空间
Columnstore 是一种不可修改的索引类型,因此您不能在 OLTP 环境中使用它
您以这种方式使参照完整性控制变得非常复杂。您不能只创建外键来确保您获得字段的有效值。
索引将是一场噩梦
这里真正的问题是开发人员不了解设计。
保持客户端数据的原始格式很好。我以做这种事情为生,而且我一直得到有 500 多个字段的表。处理它的方法是将您的
RAW
数据与您的BUILT
数据分开。如果客户给你一个非常宽的表,你需要自己规范化它来制作一个可用的数据集。没有什么能阻止您创建一个将数据分解到适当表格中的过程。