SQL Server 2005,Caches和所有爵士乐

时间:2009-11-11 11:32:04

标签: sql-server-2005 caching distributed-caching

问题背景:我正在寻找为我的网站实施缓存系统。目前我们正在探索memcache作为这样做的一种方式。但是,我希望看看SQL Server是否存在类似的东西。我知道MySQL有查询缓存虽然不是分布式的,但它可以作为一种“停止间隙”措施。 MySQL查询缓存是否等同于SQL Server中的缓冲区缓存?

所以这是我的问题:

  1. 有没有办法知道当前存储在缓冲区缓存中?
  2. 跟进这个,有没有办法强制某些表或结果集进入缓存
  3. 我对缓冲区和过程缓存中发生的事情有多少控制权?我知道以前有一个DBCC PINTABLE命令,但已经停止使用。
  4. 稍微偏离主题:缓存是否应该存在于数据库层?或者使用Velocity / Memcache管理缓存更为谨慎?是这样,为什么?在处理具有重叠触发器的许多对象时,缓存失效似乎很麻烦。
  5. 谢谢!

4 个答案:

答案 0 :(得分:4)

System R显示方式以来,SQL Server实现了一个缓冲池,与太阳下的每个数据库产品(或多或少)相同。血腥的细节在Transaction Processing: Concepts and Techniques中解释。我还添加了一个缓存框架,它由过程缓存,权限令牌缓存和许多其他缓存类使用。该框架在Clock Hands - what are they for

中有最好的描述

但这并不是那种通常感兴趣的缓存应用程序。内部数据库缓存非常适合扩展方案,其中更强大的后端数据库能够通过使用这些缓存更快地响应更多查询,但是现代应用程序堆栈倾向于扩展Web服务器,真正的问题是在Web场使用的缓存中缓存查询interogations的结果。理想情况下,应该共享和分发此缓存。 Memcached和Velocity是此类应用程序缓存基础结构的示例。 Memcache目前已有很长的历史,它的用途和缺点是可以理解的,有很多关于如何使用它,部署,管理和监控它的技术诀窍。

应用程序层中缓存的最大问题,特别是分布式缓存,是缓存失效。如何检测后端数据中发生的更改并将缓存的条目标记为无效,以便新请求不会使用陈旧数据。

最简单的(对于简单的某些定义......)替代方案是来自应用程序的主动失效。代码知道它何时更改数据库中的实体,并且在更改发生后,需要额外的步骤来标记缓存的条目无效。这有几个简短的消息:

  • 很难确切知道哪些缓存条目无效。依赖关系可能非常复杂,事情总是更简单的表/条目,聚合查询,连接,分区数据等等。
  • 需要使用代码规则来确保修改数据的所有路径也使缓存无效。
  • 未检测到应用程序范围之外发生的数据更改。实际上,在应用程序范围之外总会发生更改:使用相同数据的其他应用程序,导入/导出和ETL作业,手动干预等。

更复杂的替代方法是在发生更改时由数据库本身通知的缓存。虽然没有多少技术支持这一点,但如果没有数据库的积极支持,它就无法运行。 SQL Server具有针对此类方案的查询通知,您可以在The Mysterious Notification阅读有关它的更多信息。在独立应用程序中实现基于QN的缓存相当复杂(并且经常做得很糟糕)但是在正确实现时它可以正常工作。在像Memcached这样的共享扩展缓存中这样做是非常强大的功能,但是可行。

答案 1 :(得分:3)

奈,

您的问题的答案如下:

  1. 来自Wiki - Always correct... ? :-)。有关Microsoft的答案,请参阅Buffer Cache

      

    缓冲管理

         

    SQL Server将RAM中的页面缓冲到   最小化光盘I / O.任何8 KB的页面都可以   在内存中缓冲,并设置   调用当前缓冲的所有页面   缓冲区缓存。记忆量   可用于SQL Server决定如何   许多页面将缓存在内存中。   缓冲区缓存由。管理   缓冲管理器。阅读或   写入任何页面将其复制到   缓冲区缓存。随后的读取或   写入被重定向到内存中   复制,而不是光盘版本。   该页面由光盘更新   缓冲区管理器仅在内存中   某些人没有引用缓存   时间。在写页面的同时   光盘,使用异步I / O.   I / O操作在a中完成   其他的后台线程   操作不必等待   I / O操作完成。每一页   与其校验和一起写   什么时候写的。在阅读时   页面返回,计算其校验和   再次与存储相匹配   版本,以确保页面没有   被破坏或被篡改   其间。

  2. 对于这个答案,请参考上面的答案:

      

    从任何页面读取或写入都会将其复制到缓冲区缓存中。后续读取或写入将重定向到内存中的副本,而不是光盘版本。

  3. 您可以查询bpool_commit_target目录视图中的bpool_committedsys.dm_os_sys_info列,以返回作为内存目标保留的页数和当前提交的页数缓冲区缓存,分别为。

  4. 我觉得微软有时间为他们的产品找出缓存,应该值得信任。

  5. 我希望这些信息有用,

    谢谢!

答案 2 :(得分:0)

对于ASP.Net应用程序来说,缓存可以有很多不同的含义,从浏览器一直传播到你的硬件,中间是IIS,应用程序,数据库。

您正在谈论的缓存是数据库级缓存,这对您的应用程序来说几乎是透明的。此级别的缓存将包括缓冲池,语句缓存等。确保您的数据库服务器有足够的RAM。理论上,DB服务器应该能够将整个DB存储加载到内存中。除非您在启动应用程序时预先获取某些预期数据并确保它位于数据库缓存中,否则您无法在此级别执行任何操作。

另一方面是内存分布式缓存系统。除了memcache和velocity之外,您还可以查看一些商业解决方案,例如NCacheOracle Coherence。我没有任何经验可以推荐。这种级别的缓存有望以更低的成本实现可扩展性。与此相比,扩展DB层的成本很高。您可能必须考虑网络带宽等方面。这种类型的缓存,特别是失效和到期可能很复杂

您可以使用IIS级别(在IIS 7中)和ASP.Net级别的输出缓存来缓存Web服务层 在应用程序级别,您可以使用ASP.Net缓存。这是你可以控制最多的,给你带来好处的。

然后在客户端Web代理层上进行缓存,可以通过缓存控制HTTP头控制。

最后,您拥有浏览器级缓存,查看状态和小数据的Cookie。

不要忘记像SAN这样的硬件也会在物理磁盘访问级别缓存。

总之,缓存可以在多个级别进行,您可以为您的方案分析和实施最佳解决方案。您已经发现数据的稳定性和波动性,预期负载等。我相信ASP.Net级别的缓存(特别是对象)可以为您提供最大的灵活性和控制。

答案 3 :(得分:0)

关于SQL Server的缓冲区缓存的具体技术问题在“为我的网站实现缓存系统”方面走错了路。

当然,SQL Server将缓存数据,以便它可以提高性能(并且它也能很好地完成),但是在Web前端实现缓存层的目的是避免与之交谈数据库根本 - 因为即使您的查询完全从SQL Server的缓存中完成,仍然存在开销和资源争用。

你想要研究的是:memcached,Velocity,ASP.NET Cache,P& P Caching Application Block等。