如果我有一个大型表,其列的值范围相当有限(例如<100),将该表划分为多个名称与该列值相关联的表是否合理?
E.g。像列一样的表:
table "TimeStamps": [Id] [DeviceId] [MessageCounter] [SomeData]
其中[DeviceId]
是“有限范围”列,将分为几个不同的表:
table "TimeStamps1": [Id] [MessageCounter] [SomeData] table "TimeStamps2": [Id] [MessageCounter] [SomeData] ... table "TimeStampsN": [Id] [MessageCounter] [SomeData]
我对原始表的问题是,为某些DeviceId值找到最大的MessageCounter值需要很长时间才能执行(参见this post)。
如果表格是分开的,找到最大列号应为O(1)操作。
[编辑]
偶然发现了这件事,以为我会更新它。通过一些正确的索引配置和预定的索引重组作业,我能够通过规范化表单获得出色的性能。我建议为每个瓶颈查询尝试使用SSMS 数据库引擎优化顾问工具,这对于主要工作不是数据库设计的人来说非常有帮助。
答案 0 :(得分:6)
虽然您可以将其作为最后沟渠性能优化,但我会建议不要这样做。主要是因为它使得很难容纳新的DeviceID。
无论如何,这样做不应该是必要的。如果存在DeviceID的索引,则DBMS应该能够非常快速地对其进行过滤。毕竟,这就是DBMS的用途......
答案 1 :(得分:5)
我担心这种方法会增加需要访问此数据的任何应用程序的复杂性。另一种方法是将每个设备放在一个单独的表中,同时仍然将所有设备保存在同一个表中,从而获得任何好处,就是在DeviceID上对表进行分区。我建议您调查表分区以确定它是否符合您的需求。
分享并享受。
答案 2 :(得分:2)
这是分布式数据库的用途。服务器根据某些列共享同一数据库中的表。您告诉服务器如何根据列值的范围分发表。设置完成后,您只需查询表,而不关心数据实际驻留在哪个服务器上。
答案 3 :(得分:1)
您是否考虑过数据库分区?对于您所描述的问题类型,这是解决方案。请参阅:Partitioned Tables and Indexes in SQL Server 2005