SQL Server:出于性能原因镜像/缓存当前数据

时间:2013-11-29 13:44:12

标签: sql sql-server performance caching mirroring

是否存在任何现有(非专有)解决方案如何将当前日数据镜像到具有最小延迟(低于秒)的单独磁盘上,以便我可以使用更小,非冗余但更昂贵的磁盘来实现高读取速率? (特别是对于SQL Server 2012)

更多背景资料:

  • 我们有一个需要冗余的跨国数据库,每天有几十个新行(处理没有任何问题);但对DB的主要影响来自于每秒几次发生的读取。读取需要有新数据(最长1秒),但他们只对当前数据感兴趣。所有写入都需要以非常小的延迟进入磁盘阵列。
  • 我可以使用小型快速但非冗余的SSD磁盘来优化读取。

几乎没有专有选择 - 例如将每个更新发送到两个单独的非相关DB - 一个较慢且冗余;和其他更快的阅读。

但是有没有现成的解决方案 - 如何将所有插入镜像到辅助DB(并清除每个午夜)?

3 个答案:

答案 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上,并将历史记录保存在您选择的任何磁盘上。