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打开不会阻止清除计划缓存。我将从几个链接开始

  • 了解为什么缓存会被清除(内存限制、太多计划(无法全部保存)、索引重建操作等
除此之外,该查询是可疑的。我不希望您的应用程序使用这些结果。也就是说,我不希望您每次调用应用程序时都将两个表中的每一行和每一列加载到应用程序中。请理解,相同表上的不同查询(如选择较少的列、添加谓词等)可以ly将导致SQL Server生成一个新的查询计划,该计划将更加优化。当前查询(没有谓词和选择每一列…也没有您所说的索引)将只执行两次表扫描。性能的任何提高都不会是因为计划被缓存,而是因为数据存储在mem中ory和后续读取不会经历物理读取。即,它是从内存读取而不是从磁盘读取


还有很多可以说的,但是我会在这里停止。

你也可以考虑把这个查询放到一个存储过程中,然后它可以被安排在一个固定的间隔中,通过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