首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >server计划缓存中的即席查询和准备查询之间有什么区别?

server计划缓存中的即席查询和准备查询之间有什么区别?
EN

Stack Overflow用户
提问于 2016-06-28 09:40:12
回答 1查看 7.5K关注 0票数 5

我正在尝试理解sql服务器的计划缓存内容。

所以我的问题是:

  1. 临时计划和准备好的计划有什么区别? 2.当我试图优化sql服务器计划缓存时,我应该知道些什么?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-28 10:30:49

临时计划和准备好的计划有什么区别?

Adhoc查询:

代码语言:javascript
运行
复制
select * from t1

准备的查询:

用位置持有者代替实际值的查询称为准备语句。

一些例子:

代码语言:javascript
运行
复制
select * from t1 where id=@id

再举一个维基百科的例子:

代码语言:javascript
运行
复制
command.CommandText = "SELECT * FROM users WHERE USERNAME = @username AND ROOM = @room";

    command.Parameters.AddWithValue("@username", username);
    command.Parameters.AddWithValue("@room", room);

当我试图优化sql服务器计划缓存时,我应该知道什么呢?

有关于如何优化计划cache.so的白皮书,我会尽量少做。

通常,当对SQL执行查询时,SQL编译该计划并将其存储在计划缓存中,.This计划缓存是从缓冲池提取的内存,不同版本对将使用多少内存有不同的限制。

您知道内存是一种宝贵的资源,如果有泄漏的,那么任何数量的硬件都是不够的。

假设您只提交了一次或两次查询,并且您倾向于提交类似的查询,lot.SQL会将该查询的计划存储在计划缓存中,这通常会使PlanCache膨胀,这是很糟糕的。

有不同的DMVS,这将帮助您挖掘通过计划缓存。

在计划缓存中查找不同类型对象的查询:

代码语言:javascript
运行
复制
select 
objtype,count(*) as countt,sum(size_in_bytes)*1024.0 as memoryinkb
 from   sys.dm_exec_cached_plans a
 group by objtype

Adhoc,准备好的查询,这些查询会使plancache臃肿,并且只使用一次:

代码语言:javascript
运行
复制
select q.query_hash, 
    q.number_of_entries, 
    t.text as sample_query, 
    p.query_plan as sample_plan
from (select top 20 query_hash, 
            count(*) as number_of_entries, 
            min(sql_handle) as sample_sql_handle, 
            min(plan_handle) as sample_plan_handle
        from sys.dm_exec_query_stats
        group by query_hash
        having count(*) > 1
        order by count(*) desc) as q
    cross apply sys.dm_exec_sql_text(q.sample_sql_handle) as t
    cross apply sys.dm_exec_query_plan(q.sample_plan_handle) as p

到删除正在膨胀的计划缓存的语句:

代码语言:javascript
运行
复制
DECLARE @MB decimal(19,3)
        , @Count bigint
        , @StrMB nvarchar(20)


SELECT @MB = sum(cast((CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN size_in_bytes ELSE 0 END) as decimal(12,2)))/1024/1024 
        , @Count = sum(CASE WHEN usecounts = 1 AND objtype IN ('Adhoc', 'Prepared') THEN 1 ELSE 0 END)
        , @StrMB = convert(nvarchar(20), @MB)
FROM sys.dm_exec_cached_plans


IF @MB > 10
        BEGIN
                DBCC FREESYSTEMCACHE('SQL Plans') 
                RAISERROR ('%s MB was allocated to single-use plan cache. Single-use plans have been cleared.', 10, 1, @StrMB)
        END
ELSE
        BEGIN
                RAISERROR ('Only %s MB is allocated to single-use plan cache – no need to clear cache now.', 10, 1, @StrMB)
                — Note: this is only a warning message and not an actual error.
        END
go

以上内容应能让您了解从何处开始,下面是必须阅读的主题和参考资料:

1.http://www.sqlskills.com/blogs/kimberly/category/plan-cache/

2.delaney/archive/2007/11/04/did-you-know-sp2-does-not-limit-the-amount-of-plan-cache-you-can-have.aspx

3.https://technet.microsoft.com/en-us/library/dd672789(v=sql.100).aspx

4.必须阅读SQLCAT关于使用准备语句时客户面临的问题的文章

在上面引用的文章中,金伯利建议启用Adhoc工作负载优化选项,但我建议将其测试为first.here是有趣的线 on DBA.SE

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38072550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档