Questions tagged «cache»

缓存是一种用于在内存中临时存储(缓存)数据以减少对磁盘驱动器上存储的数据的访问时间的机制。

5
为什么我不使用SQL Server选项“针对临时工作负载进行优化”?
我一直在阅读有关Kimberly Tripp的一些有关SQL Server计划缓存的精彩文章,例如:http : //www.sqlskills.com/blogs/kimberly/plan-cache-and-optimizing-for-adhoc-workloads/ 为什么甚至有“针对临时工作负载进行优化”的选项?这不应该一直都在吗?无论开发人员是否在使用即席SQL,为什么不在每个支持它的实例(SQL 2008+)上都启用此选项,从而减少缓存膨胀?

3
参数嗅探vs变量vs重新编译vs优化未知
因此,我们有一个长时间运行的进程,导致今天早晨出现问题(30秒+运行时间)。我们决定检查是否应该归因于参数嗅探。因此,我们重写了proc并将输入的参数设置为变量,以消除参数嗅探。一种尝试/正确的方法。Bam,查询时间得到改善(不到1秒)。在查看查询计划时,在原始索引未使用的索引中发现了改进。 只是为了验证我们没有得到误报,我们对原始proc进行了dbcc freeproccache,然后重新运行以查看改进的结果是否相同。但是,令我们惊讶的是,原始过程仍然运行缓慢。我们再次使用WITH RECOMPILE进行了尝试,但仍然很慢(我们在对proc的调用以及在proc自身内部尝试了重新编译)。我们甚至重新启动了服务器(显然是dev框)。 所以,我的问题是...当我们在空的计划缓存上收到相同的慢查询时,怎么应该怪参数嗅探呢?snif应该没有任何参数? 我们是否会受到与计划缓存无关的表统计信息的影响?如果是这样,为什么将传入参数设置为变量会有所帮助呢? 在进一步的测试中,我们还发现在proc DID的内部插入OPTION(优化未知)会获得预期的改进计划。 因此,你们中有些人比我聪明,您能否提供一些线索,以了解产生这种类型结果的幕后情况? 另一个要注意的是,慢速计划也有理由提前中止,GoodEnoughPlanFound而快速计划在实际计划中没有早期中止原因。 综上所述 从传入参数中创建变量(1秒) 重新编译(30秒以上) dbcc freeproccache(30+秒) 选项(为不知道而优化)(1秒) 更新: 请在此处查看慢速执行计划:https: //www.dropbox.com/s/cmx2lrsea8q8mr6/plan_slow.xml 在此处查看快速执行计划:https : //www.dropbox.com/s/b28x6a01w7dxsed/plan_fast.xml 注意:出于安全原因,表,架构,对象名称已更改。


3
频繁查询缓存失效的开销值得吗?
我目前正在使用一个MySQL数据库,在该数据库中,我们从查询缓存中看到大量无效信息,这主要是由于在许多表上执行的INSERT,DELETE和UPDATE语句数量很多。 我要确定的是,将查询缓存用于针对这些表运行的SELECT语句是否有任何好处。由于它们是如此之快地失效,在我看来,最好的办法是仅对这些表的SELECT语句使用SQL_NO_CACHE。 频繁失效的间接费用是否值得? 编辑:在下面的用户@RolandoMySQLDBA的请求下,这是MyISAM和INNODB上的信息。 创新数据库 资料大小:177.414 GB 索引大小:114.792 GB 桌子大小:292.205 GB 我的ISAM 资料大小:379.762 GB 索引大小:80.681 GB 桌子大小:460.443 GB 附加信息: 版本:5.0.85 query_cache_limit:1048576 query_cache_min_res_unit:4096 query_cache_size:104857600 query_cache_type:开启 query_cache_wlock_invalidate:关闭 innodb_buffer_pool_size:8841592832 24GB RAM

2
PostgreSQL索引缓存
我很难找到有关如何在PostgreSQL中缓存索引的“一般性”解释,因此我希望对以下任何或所有假设进行现实检查: PostgreSQL索引(如行)位于磁盘上,但可以缓存。 索引可能完全在高速缓存中,或者根本不存在。 是否缓存它取决于使用频率(由查询计划者定义)。 因此,大多数“明智的”索引将一直存在于缓存中。 索引buffer cache与行位于同一高速缓存(?)中,因此索引所使用的高速缓存空间不可用于行。 我理解这一点的动机来自另一个问题,我曾问过有人建议在不能访问大多数数据的表上使用部分索引。 在进行此操作之前,我想弄清楚使用部分索引有两个优点: 我们减小了缓存中索引的大小,从而为缓存中的行本身释放了更多空间。 我们减小了B树的大小,从而加快了查询响应速度。

2
查找数据库中所有表的未压缩大小
在Dynamics AX中,存在一种缓存机制,可以将表配置为加载到内存中并进行缓存。此高速缓存限制为一定数量的KB,以防止出现内存问题。我正在谈论的设置被调用,entiretablecache并在请求单个记录时立即将整个表加载到内存中。 直到最近,我们还是依靠一些脚本来验证具有此设置的表的大小,以查看表大小是否超过此限制。 现在,压缩开始发挥作用,像sp_spaceused或sys.allocation_units之类的东西似乎报告了压缩数据实际使用的空间。 显然,应用程序服务器正在处理未压​​缩的数据,因此SQL Server中磁盘上的数据大小无关紧要。我需要未压缩数据的实际大小。 我知道sp_estimate_data_compression_savings,但是顾名思义,这只是一个估计。 我希望尺寸尽可能正确。 我能想到的唯一方法是一些复杂的动态SQL创建与压缩表具有相同结构的未压缩表,将压缩数据插入该影子表中,然后检查该影子表的大小。 不用说,这有点乏味,并且需要花费一些时间才能在数百GB的数据库上运行。 Powershell可能是一个选项,但是我不想遍历所有表以select *对它们执行操作以检查脚本中的大小,因为那样只会淹没缓存,并且可能还需要很长时间。 简而言之,如果可能的话,我需要一种获取每个表大小的方法,因为一旦将其解压缩,就可以将碎片从呈现给应用程序的方程式中分离出来。我对各种方法持开放态度,首选使用T-SQL,但我不反对Powershell或其他创造性方法。 假设应用程序中的缓冲区是数据的大小。bigint始终是bigint的大小,并且字符数据类型为每个字符2个字节(unicode)。BLOB数据也占用数据的大小,枚举基本上是int,数字数据是numeric(38,12),datetime是datetime的大小。另外,没有NULL值,它们要么存储为空字符串,要么存储1900-01-01为零。 没有有关如何实现此方法的文档,但是这些假设是基于一些测试以及PFE和支持团队使用的脚本(显然,它们也忽略了压缩,因为检查是在应用程序中构建的,而应用程序无法分辨(如果基础数据已压缩),这还将检查表大小。例如,此链接指出: 避免对大型表使用EntireTable缓存(在AX 2009中超过128 KB或16页,在AX 2012中超过“整个表缓存大小”应用程序设置[默认值:32KB或4页])–改为记录缓存。

1
FreeProcCache和FreeSystemCache之间的区别
当前,DBCC FREEPROCCACHE当我想在运行SQL查询之间将信息从缓冲池中擦除时,我正在运行。不过,我正在审查此 Technet文章引用DBCC FREESYSTEMCACHE。什么FREESYSTEMCACHE擦除不会擦除FREEPROCCACHE?
12 sql-server  cache 

1
Qcache_free_memory还不满,我得到了很多Qcache_lowmem_prunes
我刚刚开始涉足CMS的查询缓存。 谁能告诉我(或至少提供一个良好的猜测)为什么我得到了很多的Qcache_lowmem_prunes时候有一半以上Qcache_free_memory是免费的吗? query_cache_size=512M query_cache_limit=1M 这是大约12小时后的样子 show status like '%qcach%'; +-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | Qcache_free_blocks | 10338 | | Qcache_free_memory | 297348320 | | Qcache_hits | 10254104 | | Qcache_inserts | 6072945 | | Qcache_lowmem_prunes | 725279 | | Qcache_not_cached | 2237603 | | Qcache_queries_in_cache | 48119 …


3
如何提高MS SQL Server中原始查询的性能?
我有一个ASP.NET网站,它拥有自己的独立数据缓存,并且数据不会长时间更改,因此它不需要使用相同的查询第二次查询SQL Server。我需要提高转到该SQL Server的首次(原始)查询的性能。一些查询处理的数据太多,可能导致SQL Server使用tempdb。我不使用临时表变量或临时表,因此SQL Server决定tempdb在需要时自行使用。 我的数据库大小为16Gb,服务器计算机上有32Gb的物理RAM。 我了解MS SQL Server缓存策略会尝试将数据保留在RAM中,以加快类似查询的性能(如果它们需要再次加载相同的数据)。除此之外,它将尝试使用可用的RAM代替tempdb来提高性能,而不会引起磁盘访问。 我想当需要在tempdb SQL Server中存储一些内容的查询出现并且没有足够的RAM可用时,SQL Server有2个选择: 1)卸载一些缓存的数据并使用备用的RAM代替tempdb以避免磁盘写入 2)保留缓存的数据以备将来查询,并开始使用tempdb,这会导致写入慢速磁盘。 我不知道在这种情况下SQL Server会做出什么选择,但我希望它成为选择#1,因为我只关心首次查询(原始)的性能,因为我再也不会向SQL Server发送相同的查询了。 (尽管我可能会发送类似的查询)。 在这种情况下,SQL Server缓存策略是什么? 在避免针对原始查询的tempdb和第二次查询的速度之间,如何平衡RAM的使用? 是否可以以选择#1的方式配置SQL Server?如果是,那怎么办? 我还能如何提高所有原始SQL查询的性能? 由于我不了解SQL Server缓存策略,因此我想将数据库放在RAM磁盘上。这将确保即使SQL Server始终选择#1,任何原始查询都可以高速加载未缓存的数据。这样做的风险是,如果SQL Server继续选择#2,则可能会开始使用更多具有较少可用RAM的tempdb(在我将16Gb用于RAM磁盘后仅剩下16Gb),这将减慢那些导致溢出的原始查询的速度tempdb。 我对SQL 2008 R2的解决方案感兴趣,但是我想对于SQL 2008,SQL 2005可能是相同的,并且可能是SQL 2000。 说明: 该框上没有其他应用程序在运行,它专用于SQL Server。网站在单独的框中运行。 它是Windows Server 2008 R2 Enterprise 64位上的SQL Server 2008 R2 Standard Edition 64位。 …

1
有关SQL Server基准测试的明确步骤列表?
在为使用SQL Server的应用程序运行性能测试/基准之前,我希望能够将实例设置为“干净”状态,而无需重新启动实例。我倾向于遵循一些步骤,但是我想建立一个确定的列表,该列表的顺序正确,没有多余的步骤。 此步骤列表是否完成将SQL Server设置为“干净”状态? 顺序逻辑/正确吗? 有多余的步骤吗? CHECKPOINT -- Write all dirty pages DBCC DROPCLEANBUFFERS -- All should be clean after checkpoint? DBCC FREEPROCCACHE -- Clear the plan cache DBCC FREESYSTEMCACHE -- Is this necessary after FREEPROCCACHE? DBCC FREESESSIONCACHE -- May not be necessary if distributed queries aren't used, but want …

1
SQL每隔几分钟就会从缓冲区缓存中转储所有页面
我有一个运行多个数据库的SQL2012 SP4节点。 该服务器有20GB可用内存,已为SQL分配了14GB内存(包装盒上没有其他任何东西)。 SQL每隔几分钟就会转储整个缓冲区高速缓存。页面预期寿命为零,缓冲区高速缓存描述符显示高速缓存中没有任何内容。 我查看了资源监视器通知,并且通知每隔几毫秒从高/稳定/低反弹一次: RESOURCE_MEMPHYSICAL_LOW RESOURCE_MEM_STEADY RESOURCE_MEMPHYSICAL_LOW 时间戳相隔几毫秒。PLE本质上是锯齿形。 我已经在SQL2012 SP1和以下问题之前看到过这种情况: 未使用缓冲区高速缓存中的SQL Server 2012可用页 似乎是类似的问题,尽管我已经更新到SP4。 我尝试为该服务帐户打开LPIM,并且尝试弄乱最大内存设置。降低最大内存似乎已导致缓冲区缓存更频繁地清空。 关于下一步要检查的任何想法? 服务器工作负载实际上什么都没有(我正在滚动浏览ERP系统中的项目列表,在缓存再次下降之前,它达到了40-50MB)。 这很有趣,因为我从SP1升级以尝试解决此问题-那里的缓存已达到500MB左右。从那以后,我将最大内存设置降低到14GB,这似乎使情况变得更糟。 我想知道Windows是否惊慌并在SQL上发出有关内存压力的不正确通知-随之而来的是,将最大内存设置为无界的服务器似乎运行正常,但永远不会填满超过几百MB的缓存-但现在它刚到50岁... 更多信息:对于那些询问 核心数: 4 数据库大小: 80GB 错误日志显示: A significant part of sql server process memory has been paged out. This may result in a performance degradation. Duration: 0 seconds. Working set …

1
一个表占用多少内存?
有没有办法找出一个表在SQL Server(2005及更高版本)中占用了多少内存? 例如,假设我有一个包含3000万条记录的表。我想知道缓冲区高速缓存中当前有多少个属于此表的页面,包括索引,数据和文本/图像页面。 我是通过Pinal Dave找到此查询的,但似乎此查询仅返回按索引分配的页面(无论是聚集的还是未聚集的页面)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.