MS SQL Server查询缓存
我的一个项目有一个非常大的数据库,我不能在上面编辑索引等,必须按原样工作 我在测试一些查询时看到的情况,这些查询将通过我在MS SQL Server查询缓存,sql,.net,sql-server,database,service,Sql,.net,Sql Server,Database,Service,我的一个项目有一个非常大的数据库,我不能在上面编辑索引等,必须按原样工作 我在测试一些查询时看到的情况,这些查询将通过我在.net中编写的服务在他们的数据库上运行。第一次跑步的时候速度很慢吗 他们以前做的是-他们有两个主要的(大的)表,主要使用。他们向我展示了他们打开SQLServerManagementStudio并运行 SELECT * FROM table1 JOIN table2 第一次运行该查询大约需要5分钟,但如果不关闭SQL Server Management Studio而
.net
中编写的服务在他们的数据库上运行。第一次跑步的时候速度很慢吗
他们以前做的是-他们有两个主要的(大的)表,主要使用。他们向我展示了他们打开SQLServerManagementStudio并运行
SELECT *
FROM table1
JOIN table2
第一次运行该查询大约需要5分钟,但如果不关闭SQL Server Management Studio而再次运行该查询,则大约需要30秒。他们所做的是保持SQL Server Management Studio 24/7开放,以便当其中一个程序执行与这两个表相关的查询时(似乎几乎所有查询都是由程序运行的),运行时间为30秒,而不是5分钟
这是因为我假设这两个表被缓存,然后没有(或几乎没有)磁盘读取
让一个服务偶尔运行一个查询来缓存这两个表,这是一个好主意吗?或者,考虑到我不能编辑索引或拆分表等事实,是否有更好的解决方案
编辑:
抱歉,我可能不清楚,数据库希望已经有索引,只是我不允许编辑它们或任何东西 编辑2:
您不能创建索引吗?这是关于性能的最大问题。更好的解决方案是创建适当的索引,并通过检查等待状态、资源争用等来解决任何性能问题。。。我将从开源和开源工具开始,然后继续前进 保持SSM打开不会阻止清除计划缓存。我将从几个链接开始
- 了解为什么缓存会被清除(内存限制、太多计划(无法全部保存)、索引重建操作等
还有很多可以说的,但是我会在这里停止。
你也可以考虑把这个查询放到一个存储过程中,然后它可以被安排在一个固定的间隔中,通过SQL代理来保持所需的页面缓存。 这可能是索引视图的一个候选(如果你能说服你的DBA创建它)!,例如:CREATE VIEW transhead_transdata
WITH SCHEMABINDING
AS
SELECT
<columns of interest>
FROM
transhead th
JOIN transdata td
ON th.GID = td.HeadGID;
GO
CREATE UNIQUE CLUSTERED INDEX transjoined_uci ON transhead_transdata (<something unique>);
CREATE VIEW transhead\u transdata
诡计多端
作为
挑选
从…起
转运头
加入transdata td
在th.GID=td.HeadGID;
去
在transhead_transdata()上创建唯一的聚集索引transjoined_uci;
这将“预计算”连接(并在
transhead
和transdata
更改时保持同步)。感谢@scsimon@Branko Dimitrijevic两位的回答,我认为他们真的很有用,并且指引了我正确的方向
最后,两个最大的问题是硬件资源(RAM,没有SSD)和设置为True的自动关闭功能
我所做的其他修复(在这里为尝试改进的其他人撰写):
- 助手服务工具将每周一次重新排列(碎片整理)索引 每周重建一次,每月重建一次
- 创建一个包含两个表中所有列的视图,以消除连接成本
- 建议DBA可能有助于使用更好的表/索引
- 建议改进服务器硬件
我将接受@Branko Dimitrijevic的回答,因为我不能同时接受这两个答案我不能创建索引,因为这是我力所能及的事情-他们想销售一种不是我编写或管理的产品(pos系统)和/或对pos系统的支持。我只编写了一个小工具(windows服务)这将允许他们每x小时自动调用数据库中的过程。这些过程可能是简单的清理过程或他们想要的任何东西。因此他们要求我包含此“缓存查询”,并保持其连接打开(可能不时执行它以确保它不会从缓存中清除)因为这将使他们的原始程序运行得更快。抱歉,我可能不清楚,数据库希望已经有索引,只是我不允许编辑它们或任何东西。数据存储在内存中,后续读取不会经历物理读取。即,它是从内存读取,而不是从磁盘读取。我认为这就是实际问题所在是的,即使我从join查询中创建了一个视图,实际需要的是什么?(不确定是否可能)可能是为了将结果保存在内存中。考虑到数据库是在4GB或8GB RAM机器上运行的,这对我来说可能很难实现,我想…是的,这是相当低的RAM,所以这将很难实现。你可以使用内存优化表,但这与通过服务定期运行查询本身没有太大区别。问题th如果没有到db的活动连接,db缓存是否会被清除?如果某些系统进程、计划作业等启动,并且需要内存,这将导致SQL Server刷新计划以释放内存,那么我们将返回初始解决方案-my s