我们正在将我们的SAAS系统从Oracle迁移到Azure SQL。我们预计,Azure SQL中的可用缓冲区缓存将比Oracle服务器中的可用缓冲区缓存少(即使滑块在Azure中已最大化)。我们的应用程序非常依赖于缓冲区缓存的性能。选择导致频繁运行表扫描的选择将导致大量数据存储在缓冲区高速缓存中,并且将读取整个页面。我们无法完全删除这些表扫描。因此,为了尝试减少Azure SQL中对缓冲区缓存的需求,我们考虑使用命令>>在行外存储nvarchar(max)
值。
EXEC sp_tableoption 'MYTABLE.NVARCHARMAX_COL', 'large value types out of row', 1;
想法是,由于列值未存储在页面中,因此扫描的数据较少,因此要存储在缓冲区高速缓存中的数据较少。
这是正确的假设吗?
据我们了解,nvarchar(#)
将导致查询获得#/ 2的内存授权。
nvarchar(max)
的内存授予是什么?
内存授予将与缓冲区高速缓存竞争,还是缓冲区高速缓存具有比内存授予更高的优先权?
在缓冲区高速缓存使用方面,使用nvarchar(max)
和行外存储而不是nvarchar(#)
有什么好处吗?还是相反?
[我们知道nvarchar(max)
的其他缺点,例如读写速度较慢(50%-100%?),无法对其进行索引。
我们正在将我们的SAAS系统从Oracle迁移到Azure SQL。我们预计,Azure SQL中的可用缓冲区缓存将比Oracle服务器中的缓冲区缓存少(即使使用...
尽管Oracle和SQL都是数据库引擎,但是它们在行为方式以及如何优化应用程序以充分利用它们方面具有不同的个性。我不会从您对SQL提出的那种调整选择开始-通常在行中具有较小的LOB是一件好事,人们很少需要弄乱该设置。但是,对于从其他数据库供应商的产品迁移过来的SQL Azure是否感到满意,通常还有其他一些更重要的事情。 (索引选择是一种常见的选择,在这种选择中,SQL Server / SQL Azure可能会受益于与其他供应商的产品相比不常用的各种索引。SQL在OLTP应用程序中选择计划时,与其他一些产品相比,SQL通常更喜欢覆盖索引。) >
SQL中跨组件的内存管理是根据每个组件的需求动态进行的。您无需进行任何调整或担心。您可能需要考虑对应用程序或您希望平衡资源使用情况(例如,CPU,内存,IO)的查询计划进行一些调整,并尽可能地利用云环境中可用的硬件与您的本地服务器不匹配。在某些情况下,我们已经完成工作,以使应用程序使用较少的tempdb或对索引进行更多索引以减少哈希联接(从而减少运行时的内存需求)。内存授予实际上是很多事情的函数-不仅仅是nvarchar的最大长度的大小(您推测,LOBS比行内的价格贵很多)。