`
pumaboyd
  • 浏览: 249709 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SQL2005执行缓存的效率

    博客分类:
  • DBA
阅读更多

这篇文章昨天就写好了。但感觉就是没把问题说明白,大家看了反而会糊涂。可能是题目范围太广,要准确的清楚,显得有些困然。如果要我写个5、6篇文章说明这个问题,我觉得累啥!最后就决定采用QA的方式,来避免题目太广的麻烦。说是QA,其实这个Q也是我,A也是我,自问自答啦!(YY:本来想找MM顶替Q的角色,我担心她会问出这样的问题“你什么时候做中饭啊!”,想想算了,我就不麻烦她啦。(*^__^*))

平时大家都知道参数化查询好,存储过程好,这里具体分析一下到底为什么好。而且这个好处不但是编译,还可以节约MSSQL占用的内存。作为开发人员和系统设计人员,应该了解到这层就够了,更深入的就交给DBA去完成啦!

QA集锦:

Q:什么是执行缓存。
A:具体大家google。我简单说一下:就是MSSQL对一些可以重复使用的过程、语句进行存储,减少相同过程、语句的重新编译(PS:语法、语义、执行计划等的分析)。举个不太恰当的比喻:
A到了一家新公司E。
第一天上班。因为只知道大概方向,所以A早起开始探路。A->B公交站->C地铁站->D公交站->E公司.A现在知道到公司的路线了(记忆在人脑中)
第二天上班。A不需要早起,按昨天的路线(记忆在大脑中)就可以到公司了。

那么执行缓存其实就是(记忆在大脑中)的这个东西,一旦MSSQL,发现有相同的存储过程、或是SQL语句,它就可以直接运行,而不需要在进行语义、语法分析等。

Q:上文有提到“相同”,那么MSSQL是如何判断存储过程(SP)、语句是相同的呢?
A:通过HashCode 哈希值来判断是否相等。有的地方也称为SQL句柄。如果他们的哈希值相同,那么就是同一个存储过程、语句。(PS:存储过程好像是根据名字来的,比如 dbo.Test1,其实他们的哈希值也是一样的啦)。MS提供一个方法 sys.dm_exec_sql_text 将哈希值转换为SQL语句噢,下面的方法就会用到这个函数!不过我没找到如何将一个SQL语句转换为SQL句柄的方法,有知道的告诉我一下。(PS:C# 有一个GetHashCode方法,道理是一样的)。

Q:知道如何判断相同,那么这些相同的存储过程(SP)、语句存储在哪里呢。
A:你就是想知道这些缓存的内容放在什么地方是吧!MS说这是一张虚拟表。这个我就不深究了,我提供两个语句(PS:语句并非原创),你可以看到具体的缓存内容。
1:sys.dm_exec_cached_plans
Select  TOP 100 usecounts,objtype,p.size_in_bytes,[sql].[text] FROM sys.dm_exec_cached_plans p OUTER APPLY sys.dm_exec_sql_text (p.plan_handle) sql
2:sys.dm_exec_query_stats
SELECT  TOP 100
         qs.execution_count,
         DatabaseName = DB_NAME(qp.dbid),
         --ObjectName = OBJECT_NAME(qp.objectid,qp.dbid),
         StatementDefinition =
                SUBSTRING (
                        st.text,
                        (
                                qs.statement_start_offset / 2
                        ) + 1,
                 (
                                       (
                                               CASE qs.statement_end_offset
                         WHEN -1 THEN DATALENGTH(st.text)
                         ELSE qs.statement_end_offset
                                               END - qs.statement_start_offset
                                       ) / 2
                                ) + 1
                ),
         query_plan,
         st.text, total_elapsed_time
 FROM    sys.dm_exec_query_stats AS qs
         CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
         CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) qp
 WHERE
     st.encrypted = 0
 ORDER BY qs.execution_count DESC

第一个方法看的内容不多,第二个方法看的内容更加详细。为什么留两个,实践一下。哈哈,看到当前的执行缓存了吧,兴奋啊!原来MSSQL大脑里就记忆了这些。有了这些大家其实也可以明白,这对于SQL语句效率的优化可是个好东西。execution_count数,当然是重复利用率越高越好了。在看看StatementDefinition,如果有很多相同或类似的证明的执行缓存重覆率太高,而且这样也消耗了大量的MSSQL内存。

方法一截图:
cache_sql_0832
方法二截图:
cache_sql2_0832

Q:那能不能清空当前的执行缓存呢?因为这样方便调试,要不一堆数据无法查看新增的执行缓存啊。
A:恩,不错,想法很好。但这个操作不能随便在生产环境运行,这样很可能造成系统效率问题。警告完了,告诉语句:dbcc freeproccache

Q:等等!再问个问题,如何查看当前使用的执行缓存呢?这样也方便调试啊,可以看到缓存的变化情况啊!
A: dbcc memorystatus,具体如图:
cache_sql3_0832

Q: 还有.....
A:打住!不耐烦了,我说最后一句。大家也可以通过SQL Profiler查看到缓存的相关动作。图上列举的Event不全,大家可以通过设置得到更多的事件。有些事件我也没太明白,用空在具体分析吧!
cache_sql_0833

总结:

说白了就是MSSQL将很多相同的语句进行保留,一旦发现相同的语句,就直接运行,而不需要去分析和处理。这样也就很自然的提高了效率。减少重复自然就减少SQL内存的占用。 对于一个高用户访问的网站,这个开销还是可观的。

实践:

给大家留下一个问题:下面三个存储过程,在执行缓存中有什么不同(PS:效率上的,文字上我也知道不同)。如果你实践了,应该就明白了。

CREATE PROCEDURE dbo.Test1
@CategoryID uniqueidentifier
AS
BEGIN
    SET NOCOUNT ON
    SELECT * FROM  be_CateGories WHERE CategoryID =  @CategoryID
END

CREATE PROCEDURE dbo.Test2
@CategoryID uniqueidentifier
AS
BEGIN
    SET NOCOUNT ON;
    exec sp_executesql N'SELECT * FROM  be_CateGories WHERE CategoryID = @CategoryID1',N'@CategoryID1 uniqueidentifier',@CategoryID1 = @CategoryID
END

CREATE PROCEDURE dbo.Test3
@CategoryID uniqueidentifier
AS
BEGIN
    SET NOCOUNT ON
    Exec('SELECT * FROM  be_CateGories WHERE CategoryID ='''+  @CategoryID + '''')
END
GO

参考:

http://database.ctocio.com.cn/tips/445/7779945.shtml

http://blog.csdn.net/xychen2008/archive/2007/08/28/1761544.aspx

http://soft.zdnet.com.cn/software_zone/2007/0821/462753.shtml

分享到:
评论

相关推荐

    sql server 查看执行效率不高的语句

    因此,掌握如何查看和分析执行效率不高的SQL语句是DBA(数据库管理员)和开发人员必备的技能之一。 SQL Server提供了丰富的DMV(动态管理视图)和系统存储过程,用于监控和诊断数据库的运行状态。其中,`sys.dm_...

    优化sql语句执行效率几点注意事项

    随着技术的发展,新的优化策略和工具不断出现,保持学习和适应能力是提高SQL执行效率的关键。 总之,优化SQL语句执行效率是一个多方面的工作,需要结合具体业务场景,综合运用索引策略、SQL编写技巧、数据库配置和...

    浅析SQL Server中的执行计划缓存(上)

    执行计划缓存的另一个关键作用是支持多个用户共享同一个执行计划,进一步提高效率。 执行计划缓存包含四种类型的对象: 1. 编译后的计划:这是实际执行的计划,类似于编译后的程序代码。 2. 执行上下文:存储与...

    SQL2005查看执行效率不高的句子

    ### SQL2005 查看执行效率不高的句子 在SQL Server 2005及更高版本中,性能优化是一项非常重要的任务,特别是在处理大量数据和复杂查询时。本篇文章将详细探讨如何通过SQL Server 2005来检查那些执行效率较低的SQL...

    SQL Server2005中的批编译,重编译和计划缓存.pdf

    ### SQL Server 2005中的批编译、重编译和计划缓存 #### 一、概述 本文深入探讨了SQL Server 2005中的批编译、重编译以及计划缓存机制,旨在帮助数据库管理员和开发人员更好地理解这些概念并优化其应用程序的性能...

    SQL语句执行过程详解

    优化器确定最佳执行计划后,会将SQL语句及执行计划存储在数据高速缓存中,以便下次执行相同查询时,可以直接使用缓存的执行计划,提高处理效率。 最后是语句的执行阶段。在完成语句解析后,数据库服务器进程会真正...

    剖析SQL Server执行计划

    为了提高效率,SQL Server会在执行计划缓存中存储已经优化过的执行计划。当相同的查询再次执行时,系统可以直接从缓存中获取已有的执行计划,从而节省了重新优化的时间。 **4. 清除缓存中的计划** 尽管执行计划...

    优化SQL Server的内存占用之执行缓存

    在上述示例中,通过改变脚本,将手机号码作为参数传递,而不是将其直接拼接到SQL语句中,使得执行效率大幅提升,从11秒缩短到1秒,并且减少了执行缓存中的计划数量。 参数化查询的优势不仅在于节省内存,还能提高...

    sql2005性能sql 性能优化

    本文将探讨如何针对SQL Server 2005进行性能优化,以提高查询速度和系统整体效率。 1. **索引优化**:索引是提升SQL查询性能的关键。合理创建和管理索引可以显著减少数据检索时间。应根据查询模式分析表的访问频率...

    关于SQL语句执行效率的研究.pdf

    为了提升效率,数据库通常会将执行计划保存在内存中,这个内存区域被称为执行缓存(plan cache)。当下次相同的查询语句到来时,数据库可以直接使用缓存中的执行计划,避免了重新编译的过程,从而提高性能。 数据库...

    SQL语句执行顺序说明

    当SQL语句进入Oracle的库缓存后,为了确保其能够被正确执行,Oracle会经历一系列的检查和准备过程。这一阶段主要涉及以下几个步骤: 1. **语法检查**:检查SQL语句的拼写是否正确以及词序是否合理。这是最基本也是...

    ecshop源码分析——用cookie缓存sql语句

    当用户访问网站时,如果某些频繁执行的SQL语句能够被存储在客户端的Cookie中,服务器就可以避免重复计算,直接读取缓存的数据,从而提升效率。 在实际应用中,这种技术适用于那些不涉及敏感信息、且对实时性要求不...

    Sql缓存依赖示例

    Sql缓存依赖是一种技术,主要用于提高应用程序的性能和效率,特别是在处理大量数据时。它的工作原理是基于数据库查询结果的缓存,当数据库中的数据发生变化时,能够及时通知应用程序更新缓存,避免了不必要的数据库...

    SQLite的SQL语句高速缓存技术.pdf

    这种技术依据高速缓存原理,通过简化SQL语句执行过程中的词法分析和语法分析,从而减少运行时间消耗。通过这种方式,可以有效提升SQLite的整体性能。 在数据库性能评估中,SQL操作执行的时间消耗是最重要的指标之一...

    若依微服务数据库执行sql

    6. **监控与日志**:为了排查问题和优化性能,需要记录SQL执行日志,并使用工具如Prometheus或ELK栈进行监控。 7. **微服务解耦**:每个微服务通常有自己的数据库,实现数据的独立性和服务间的低耦合。若依微服务中...

    浅析SQL Server中的执行计划缓存(下)

    在SQL Server中,执行计划缓存是一个至关重要的性能优化工具,它存储了预先编译的T-SQL查询的执行计划,以便在后续的相同查询中能够快速重用,避免重复编译过程,提高系统性能。在《浅析SQL Server中的执行计划缓存...

    SQL Server 2005内存调优

    SQL Server 2005 支持查询计划缓存功能,可以将执行过的查询及其执行计划存储在内存中,当下次执行相同或相似的查询时,可以直接从缓存中获取执行计划,从而避免了重新编译的过程,显著提高了查询效率。 ##### 3.3 ...

    SQL 2005数据库优化

    在SQL Server 2005数据库优化中,我们面临着一系列挑战和机遇,旨在提升系统性能、减少资源消耗并提高整体数据库系统的效率。本专题将深入探讨这个领域中的关键知识点,帮助你更好地理解和应用这些技术。 一、...

    SQL语句执行原理及性能优化.pdf

    在关系数据库管理系统中,SQL语句的执行效率直接关系到整个数据库应用的性能表现。随着数据库中数据量的增长,如何确保系统在处理大量数据时仍能维持良好的响应速度和稳定性,成为开发人员必须要面对的挑战。SQL语句...

Global site tag (gtag.js) - Google Analytics