快捷搜索:  as  test  1111  test aNd 8=8  test++aNd+8=8  as++aNd+8=8  as aNd 8=8

和记怡情娱:《Microsoft Sql server 2008 Internals》读书笔记第九章Plan Caching and Recompilation(6)



上文我们懂得编译工具和重编译的原由:Correctness-Based Recompiles,Optimality-based Recompiles。本日我们继承关注若何从缓存中移除计划和计划缓存内部操作。

■从缓存中移除计划

除了基于架构或统计变更而必要重编译一个计划,SQL Server也为那些已经从计划缓存中移除的批处置惩罚从新编译计划。基于内存压力计划会从缓存中移除。然而,其他的操作也会引起计划从缓存中移除。此中的一些操作只移除某个特殊的数据库,而其他的从全部数据库实例中移除计划。

下列操作清除完全的计划缓存以使随后提交的所有的批处置惩罚依附新的计划。留意,只管一些操作仅仅影响一个数据库,但完备的计划缓存被清除。

■在SQL和记怡情娱 Server 2008中进级任何数据库

■运行一个DBCC FREEPROCCACHE或DBCC FREESYSTEMCACHE

■改变下列设置设置设备摆设摆设选项中的任何一个:

1、cross db ownership chaining

2、index create memory

3、costthresholds for parallism

4、max degreee of parallism

5、max text repl size

6、min memory per query

6、min server memory

7、max server memory

8、query governor cost limit

9、query wait

10、remote query

11、user options

下列操作清除所有与某个特定命据库相关的和记怡情娱计划:

■运行一个DBCC FLUSHPROCINDB敕令

■Detaching a database

■关闭或打开一个auto-close的数据库

■应用ALTER databse…………Collate敕令改动一个数据库的Collation

■应用下列敕令改动数据库:

1、Alter database…………modify_Name

2、Alter database…………modify Filegroup

3、Alter database…………set online

4、Alter database…………set offline

5、Alter database…………set emergency

6、Alter database…………set read_only

7、Alter database…………set read_write

8和记怡情娱、Alter database…………collate

■ Droping a database

从缓存创建一个计划有两种要领:一、创建一个计划领导,以准确匹配针对缓存计划的SQL文本。与文本有关的所有计划将会自动移除。SQL Server2008供给了一种简略单纯的要领从计划缓存创建一个计划领导。后面会有具体先容。二、在SQL Server 2008中应用DBCC FREEPROCCACHE,语法如下:

DBCC FREEPROCCACHE [ ( { plan_handle | sql_handle | pool_name } ) ] [ WITH NO_INFOMSGS ]

更具体的用法,请查看MSDN:http://msdn.microsoft.com/zh-cn/library/ms174283.aspx

该敕令容许你定义三个参数中的一个,以唆使你想从缓存中移走一个或多个计划。

■plan_Handle

经由过程定义一个plan_Handle,你可以使用缓存里的句柄移除计划。Plan_Handle用以确认所有当前已经存在的计划中的惟一性。

■sql_Handle

经由过程定义一个sql_Handle,你可以使用缓存里的句柄移除计划。假如任何一个缓存键值改变,你可以为相同的SQL文本有多个计划,比如Set选项。演示代码如下:

USE Northwind2;

GO

DBCC FREEPROCCACHE;

GO

SET ANSI_NULLS ON

GO

SELECT * FROM orders WHERE customerid = 'HANAR';

GO

SELECT * FROM Orders WHERE CustomerID = 'CENTC';

GO

SET ANSI_NULLS OFF

GO

SELECT * FROM orders WHERE customerid = 'HANAR';

GO

SET ANSI_NULLS ON

GO

SELECT execution_count, text, sql_handle, query_plan

FROM sys.dm_exec_query_stats

CROSS APPLY sys.和记怡情娱dm_exec_sql_text和记怡情娱(sql_handle) AS TXT

CROSS APPLY sys.dm_exec_query_plan(plan_handle)AS PLN;

GO

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

您可能还会对下面的文章感兴趣: