代码之家  ›  专栏  ›  技术社区  ›  PaulB

如何清除SQL Server查询缓存?

  •  181
  • PaulB  · 技术社区  · 15 年前

    我有一个针对SQL Server 2005的简单查询

    SELECT * 
    FROM Table 
    WHERE Col = 'someval'
    

    我第一次执行查询时 > 15 secs . 后续执行返回 < 1 sec .

    如何使SQL Server 2005不使用任何缓存结果?我试过跑步

    DBCC DROPCLEANBUFFERS
    DBCC FREEPROCCACHE
    

    但这似乎对查询速度没有影响(仍然 <1秒 )

    5 回复  |  直到 7 年前
        1
  •  240
  •   Sheridan    9 年前

    这是一些很好的解释。检查一下。

    http://www.mssqltips.com/tip.asp?tip=1360

    CHECKPOINT; 
    GO 
    DBCC DROPCLEANBUFFERS; 
    GO
    

    从链接的文章:

    如果所有的性能测试都是在SQL Server中进行的,那么最好的方法可能是发出一个检查点,然后发出dbcc dropcleanbuffers命令。尽管检查点进程是SQL Server中的一个自动内部系统进程,并且经常发生,但发出此命令将当前数据库的所有脏页写入磁盘并清除缓冲区是很重要的。然后可以执行dbcc dropcleanbuffers命令以从缓冲池中删除所有缓冲区。

        2
  •  9
  •   Tony Basallo    8 年前

    虽然这个问题有点老套,但这可能还是有帮助的。我遇到了类似的问题,使用下面的选项对我有所帮助。不确定这是否是一个永久性的解决方案,但目前正在解决。

    OPTION (OPTIMIZE FOR UNKNOWN)
    

    那么你的问题是这样的

    select * from Table where Col = 'someval' OPTION (OPTIMIZE FOR UNKNOWN)
    
        3
  •  7
  •   Somnath Muluk    7 年前

    清除计划缓存的八种不同方法

    1.从整个实例的计划缓存中删除所有元素

    DBCC FREEPROCCACHE;
    

    使用此选项可以仔细清除计划缓存。释放计划缓存会导致存储过程重新编译,而不是从缓存中重用。这可能会导致查询性能突然临时下降。

    2。刷新整个实例的计划缓存并禁止常规完成消息

    “DBCC执行完成。如果DBCC打印了错误消息,请与系统管理员联系。“

    DBCC FREEPROCCACHE WITH NO_INFOMSGS;
    

    三。刷新整个实例的临时和准备好的计划缓存

    DBCC FREESYSTEMCACHE ('SQL Plans');
    

    4。为一个资源池刷新临时和准备好的计划缓存

    DBCC FREESYSTEMCACHE ('SQL Plans', 'LimitedIOPool');
    

    5。刷新一个资源池的整个计划缓存

    DBCC FREEPROCCACHE ('LimitedIOPool');
    

    6。从一个数据库的计划缓存中删除所有元素(在SQL Azure中不起作用)

    -- Get DBID from one database name first
    DECLARE @intDBID INT;
    SET @intDBID = (SELECT [dbid] 
                    FROM master.dbo.sysdatabases 
                    WHERE name = N'AdventureWorks2014');
    
    DBCC FLUSHPROCINDB (@intDBID);
    

    第七章。清除当前数据库的计划缓存

    USE AdventureWorks2014;
    GO
    -- New in SQL Server 2016 and SQL Azure
    ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;
    

    8。从缓存中删除一个查询计划

    USE AdventureWorks2014;
    GO
    
    -- Run a stored procedure or query
    EXEC dbo.uspGetEmployeeManagers 9;
    
    -- Find the plan handle for that query 
    -- OPTION (RECOMPILE) keeps this query from going into the plan cache
    SELECT cp.plan_handle, cp.objtype, cp.usecounts, 
    DB_NAME(st.dbid) AS [DatabaseName]
    FROM sys.dm_exec_cached_plans AS cp CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS st 
    WHERE OBJECT_NAME (st.objectid)
    LIKE N'%uspGetEmployeeManagers%' OPTION (RECOMPILE); 
    
    -- Remove the specific query plan from the cache using the plan handle from the above query 
    DBCC FREEPROCCACHE (0x050011007A2CC30E204991F30200000001000000000000000000000000000000000000000000000000000000);
    

    来源 1 2 3

        4
  •  5
  •   erikkallen    15 年前
    EXEC sys.sp_configure N'max server memory (MB)', N'2147483646'
    GO
    RECONFIGURE WITH OVERRIDE
    GO
    

    为服务器内存指定的值并不重要,只要它与当前值不同。

    顺便说一句,导致加速的不是查询缓存,而是数据缓存。

        5
  •  3
  •   MSC    8 年前

    注意两者都不是 DBCC DROPCLEANBUFFERS; 也不 DBCC FREEPROCCACHE; 在SQL Azure/SQL数据仓库中受支持。

    但是,如果需要重置SQL Azure中的计划缓存,可以更改查询中的一个表(例如,只添加然后删除列),这将产生从缓存中删除计划的副作用。

    我个人这样做是为了测试查询性能,而不必处理缓存计划。

    More details about SQL Azure Procedure Cache here