我们有2张桌子。一个持有测量值,另一个持有时间戳(每分钟一个) 每个测量都将FK保持为时间戳。 我们有800万(百万)次测量和2M时间戳。
我们正在通过复制创建一个报告数据库,我的第一个解决方案就是:当通过复制过程收到新的测量时,查找正确的时间戳并将其添加到测量表中。 是的,它是重复数据,但是它用于报告,因为我们每5分钟进行一次测量,用户可以查询年度数据(105.000次测量),我们必须优化速度。
但是一位合作开发人员说:你不必这样做,我们只会用连接查询(在两个表上),SqlServer是如此之快,你看不出差别。
我的第一反应是:加入两张8M和2M记录的表不能“没有区别”。
你对此的第一感觉是什么?
编辑: 新测量:每5分钟400条记录
编辑2: 也许问题不是那么清楚:
第一种解决方案是从时间戳表中获取数据,并在插入测量记录时将其复制到测量表。 在这种情况下,我们在插入记录时有一个动作和一个额外的(重复的)时间戳值。在这种情况下,我们只能查询一个表,因为它包含所有数据。
第二种解决方案是在查询中连接两个表。
答案 0 :(得分:3)
使用正确的索引,连接将没有区别*。我最初的想法是,如果报告正在查询整个数据集,那么连接实际上可能会更快,因为它必须从磁盘读取的时间戳减少了600万。
*这只是根据我对拥有数百万条记录的表的体验而进行的猜测。您的结果会因您的查询而异。
答案 1 :(得分:2)
如果查询只检索给定日期范围的数据,则会有合并连接 - 即每个拖动表的范围扫描。由于时间戳表可能只包含时间戳,因此这不应该很昂贵 另一方面,如果日期列上只有一个表和索引,则索引本身会变得更大,扫描也更昂贵。
因此,通过正确构建索引和查询,我不会期望性能有显着差异 我建议你保持正确的标准化设计,直到你开始出现性能问题迫使你改变它。然后,您需要仔细分析查询计划并使用不同的选项衡量性能 - 在您的特定情况下,有很多事情可能很重要。
答案 2 :(得分:2)
我创建了一个Indexed View(类似于Oracle中的Materialized视图),它使用适当的索引连接表。
答案 3 :(得分:2)
坦率地说,在这种情况下,最好的办法是尝试两种解决方案,看看哪种解决方案更好。当您开始讨论大型数据集时,性能调优是一门艺术,并且高度依赖于您拥有的数据库设计,但高度依赖于硬件以及您正在使用分区等等。确保测试获取数据并将其放入由于您有这么多插入,因此插入速度至关重要,而在日期时间字段上需要的索引对于选择性能至关重要,因此您需要对此进行彻底测试。测试时不要忘记转储缓存。并且在典型的查询负载下进行多次测试,如果可能的话,进行测试。