- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试了解 SQL Server 的计划缓存内容。
所以我的问题是:
1.临时计划和准备好的计划有什么区别?
2.尝试优化sql server计划缓存时我应该了解什么?
最佳答案
What is the difference between ad hoc and prepared plans?
即席查询:
select * from t1
准备好的查询:
用占位符代替实际值的查询称为准备语句。
一些示例:
select * from t1 where id=@id
另一个来自维基百科的示例:
command.CommandText = "SELECT * FROM users WHERE USERNAME = @username AND ROOM = @room";
command.Parameters.AddWithValue("@username", username);
command.Parameters.AddWithValue("@room", room);
What should I know about it when trying to optimize the sql server plan cache?
有一些关于如何优化计划缓存的白皮书。所以我会尽量减少它......
通常,当针对 SQL 执行查询时,SQL 会编译计划并将其存储在计划缓存中。该计划缓存是从缓冲池中获取的内存,不同版本对 how much amount of memory will be used 有不同的限制。
您知道内存是宝贵的资源,如果出现泄漏,再多的硬件也不够..
假设您只提交一次或两次查询,并且您倾向于多次提交这样的查询。SQL 会将这些查询的计划存储在计划缓存中,该缓存通常会膨胀PlanCache这很糟糕
有不同的 DMVS 可以帮助您挖掘计划缓存..
在计划缓存中查找不同类型对象的查询:
select
objtype,count(*) as countt,sum(size_in_bytes)*1024.0 as memoryinkb
from sys.dm_exec_cached_plans a
group by objtype
即席、准备好的查询会导致计划缓存膨胀并且仅使用一次:
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
删除计划缓存膨胀的语句:
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/
3. https://technet.microsoft.com/en-us/library/dd672789(v=sql.100).aspx
4. Must read article By SQLCAT on issues customer faced while using Prepare Statements
在上面引用的文章中,kimberely 建议启用“针对临时工作负载优化”选项,但我建议先对其进行测试。这里是 interesting thread在 DBA.SE 上
关于sql-server - SQL Server 计划缓存中的即席查询和准备好的查询有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38072550/
我的程序将获得有效 sql 的输入,并且应该返回 sql 的列名。我想在不执行 sql 语句的情况下执行此操作。我正在寻找 Java 解决方案。 我的 dbms 是针对 olap 优化的 oracle
我最近需要对 XML 文档进行一些数据挖掘。大多数都是临时的,也就是说,我事先没有文档的架构,我只运行了几次查询。一些示例查询是“有多少元素的子元素值大于 0”或“对于某种元素,它们的某些子元素的值的
有区别吗?我知道 SQL 查询的执行计划与函数一样被缓存。 我找到了 someone告诉: Performance is an issue, and we suspect query planning
我一直在研究将报告数据库上的过程执行记录到表中,并旨在提出一个通用的代码片段,可以将其复制到我们想要记录的任何过程中。 以上内容引导我尝试使用@@ProcID。 The Microsoft docum
Xamarin.iOS 有两个奇怪的问题: 1) NavigationController.PushViewController 在启用调试的情况下可以正常工作,但在禁用调试的情况下不能正常工作。 2
我是一名优秀的程序员,十分优秀!