是否存在任何现有(非专有)解决方案如何将当前日数据镜像到具有最小延迟(低于秒)的单独磁盘上,以便我可以使用更小,非冗余但更昂贵的磁盘来实现高读取速率? (特别是对于SQL Server 2012)
更多背景资料:
几乎没有专有选择 - 例如将每个更新发送到两个单独的非相关DB - 一个较慢且冗余;和其他更快的阅读。
但是有没有现成的解决方案 - 如何将所有插入镜像到辅助DB(并清除每个午夜)?
答案 0 :(得分:1)
您在评论中说,要查询的数据适合SQL Server框中的RAM。这意味着SQL Server永远不会执行甚至单个物理IO来读取数据。这一切都来自它的缓冲池。
读取延迟将非常低。磁盘性能根本不重要。如果您正确地构造和索引数据读取查询将快速执行。
通常,拥有足够的RAM来将所有数据都安装到内存中是您可以对性能做出的最有益的事情。
您可以使用任何您喜欢的高可用性解决方案。它只会影响写入,而不会影响读取。我们在评论中已经得出结论,写作在这里并不重要。
换句话说,我认为你没有问题。
答案 1 :(得分:1)
您可以使用索引视图将当前日期数据存储在单独的数据空间中。您必须每天构建一个新视图,因此您可能希望使用同义词进行实际切换,以避免在创建视图时锁定插入。确保您在列上的过滤器结束日期。这就是我如何使用代理作业:
Job 1 (10 Minutes to midnight)
create view my_view_yyyymmdd (yyyymmdd = today + 1)
with schema_binding
as
select from mytable where datecol >=day+1 and datecol < today+2 --dateliterals;
create clustered index on my_view_yyyymmdd (yyyymmdd = today + 1)
Job2 (midnight + 1 second)
drop synonym mysyn;
create synonym mysyn for my_view_yyyymmdd (yyyymmdd = today )
drop view my_view_yyyymmdd my_view_yyyymmdd (yyyymmdd = today - 1)
您没有提及更新,因此日期上的聚簇索引不应该足以担心。您可能希望将索引上的fillfactor设置为100,这将使磁盘上的大小比默认值减少20%。这将有助于进一步降低IO命中率。
答案 2 :(得分:0)
如何拥有两个数据库,一个用于今天,另一个用于历史数据(昨天和之前),具有所有相同的表。添加新数据时,只需将其写入今天的数据库,并在午夜(或最合适的时候)将今天的数据写入历史数据库并截断今天的表格。您可以将今天的数据库保存在SSD上,并将历史记录保存在您选择的任何磁盘上。