讨论一:性能优化-(执行计划,statistics,cost模型,参数嗅探,plan compile&recompile等)

开着拖拉机泡妞 2013-12-02 09:18:08
加精
经过一周时间的收集,今天开始针对这次活动中大家感兴趣的问题进行讨论:

讨论一:

性能优化-(执行计划,statistics,cost模型,参数嗅探,plan compile&recompile等)
...全文
4927 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
最爱午夜 2014-08-22
  • 打赏
  • 举报
回复
引用 37 楼 SQL_Beginner 的回复:
经常在论坛看到问高CPU的问题,简单的总结一下。 1,首先你要确认,高CPU是不是是SQL SERVER进程引起的还是别的进程引起的,这个很容易,直接看任务管理器。 2,如果从任务管理器看出高CPU确实是用SQL SERVER引起的。 3,如果是SQL SERVER引起的。 3.1SQL SERVER的一个比较BAD的执行计划引起的,比如说缺少必要的INDEX,引起了hash join什么的。 这个也分成2种: 1,造成高CPU的语句已经执行结束,这个时候可以用下面的语句来检查。 select highest_cpu_queries.plan_handle, highest_cpu_queries.total_worker_time, q.dbid, q.objectid, q.number, q.encrypted, q.[text] from (select top 50 qs.plan_handle, qs.total_worker_time from sys.dm_exec_query_stats qs order by qs.total_worker_time desc) as highest_cpu_queries cross apply sys.dm_exec_sql_text(plan_handle) as q order by highest_cpu_queries.total_worker_time desc 3.1.2,造成高CPU的语句正在运行,这个时候可以用下面的语句来检查。 SELECT st.text, qp.query_plan, rq.* FROM sys.dm_exec_requests RQ CROSS APPLY sys.dm_exec_sql_text(rq.sql_handle) as st CROSS APPLY sys.dm_exec_query_plan(rq.plan_handle) as qp order by RQ.CPU_time desc 3.2 开启了SQL profiler. 通过3.1.2可以看到 sp_trace_getdata这个SP在运行。 3.3 过度的编译跟重编译。 可以通过下面的SQL来查 select top 25 sql_text.text, sql_handle, plan_generation_num, execution_count, dbid, objectid from sys.dm_exec_query_stats a cross apply sys.dm_exec_sql_text(sql_handle) as sql_text where plan_generation_num >1 order by plan_generation_num desc 3.4 某个系统进程造成的,比如说 Ghost cleanup, Lazy writer等。 可以通过select * from sys.sysprocesses where spid<51来查。 造成具体的引起高CPU到底是什么引起的,然后对症下药。
我觉得,第二步应该是这样的: 查看并行度,并行阀值,然后修改并行度和并行阀值。 还有就是锁定多表连接查询的SQL和存储过程,如果执行频繁,有可能是数据库设计有问题或查询逻辑需要改。
我喝多了 2014-08-20
  • 打赏
  • 举报
回复
学习
xxfvba 2014-08-12
  • 打赏
  • 举报
回复
菜鸟学习ing
gem227 2014-08-11
  • 打赏
  • 举报
回复
学习下
wangnaisheng 2014-07-31
  • 打赏
  • 举报
回复
mark一下,学习~
yoan2014 2014-05-17
  • 打赏
  • 举报
回复
这贴挖的不错,各位继续
jason131203 2014-05-16
  • 打赏
  • 举报
回复
好东西啊,学习很多
  • 打赏
  • 举报
回复
下午跟大家交流一下set statistics io on的结果如何理解以及set statistics profile on输出的结果的一些重要字段的数据是什么含义,说明什么问题。
  • 打赏
  • 举报
回复
引用 47 楼 mcxhh2005 的回复:
执行计划中Lookup或key Lookup是什么意思?谢谢
RID LOOKP和KEY look up吧? 这个是指的"书签查找" 这个可以通过修改索引来优化掉。但不一定什么时候都需要优化掉
杉子木 2013-12-24
  • 打赏
  • 举报
回复
顶一下
专注or全面 2013-12-19
  • 打赏
  • 举报
回复
Optimize for Ad hoc Workloads设为1和强制化参数的区别
专注or全面 2013-12-19
  • 打赏
  • 举报
回复
请教执行计划的生成过程


dbcc freeproccache

select * from table1 where id=1
select * from table1 where id=2

select cacheobjtype,objtype,usecounts,sql from sys.syscacheobjects  where dbid=DB_ID('dbtest1')


cacheobjtype      objtype              usecounts   sql
----------------- -------------------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Compiled Plan     Adhoc                1           select cacheobjtype,objtype,usecounts,sql from sys.syscacheobjects  where dbid=DB_ID('dbtest1')
Compiled Plan     Adhoc                1           select * from table1 where id=1
Compiled Plan     Adhoc                1           select * from table1 where id=2

(3 行受影响)



--直接拼sql的方式,生成的是Adhoc计划,没问题

--第二次测试,开启强制化参数
--下面三个sql分别执行一次,生成了一个Prepared类型的计划,并且重用了三次,可以理解,
--是强制化参数的结果
--但是这三句sql为什么还有三个Adhoc类型的计划生成,
--所以不太理解sql执行过程中,执行计划的产生过程


select * from table1 where id=1
select * from table1 where id=2
select * from table1 where id=3

select cacheobjtype,objtype,usecounts,sql from sys.syscacheobjects  where dbid=DB_ID('dbtest1')


cacheobjtype      objtype              usecounts   sql
----------------- -------------------- ----------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Compiled Plan     Adhoc                4           select cacheobjtype,objtype,usecounts,sql from sys.syscacheobjects  where dbid=DB_ID('dbtest1')
Compiled Plan     Prepared             1           (@0 varchar(8000))select cacheobjtype , objtype , usecounts , sql from sys . syscacheobjects where dbid = DB_ID ( @0 )
Compiled Plan     Adhoc                1           select * from sys.syscacheobjects  where dbid=DB_ID('dbtest1')
Compiled Plan     Adhoc                1           select * from table1 where id=1
Compiled Plan     Prepared             1           (@0 varchar(8000))select * from sys . syscacheobjects where dbid = DB_ID ( @0 )
Compiled Plan     Adhoc                1           select * from table1 where id=2
Compiled Plan     Adhoc                1           select * from table1 where id=3
Compiled Plan     Prepared             3           (@0 int)select * from table1 where id = @0

(8 行受影响)



ChinaITOldMan 2013-12-19
  • 打赏
  • 举报
回复
执行计划中Lookup或key Lookup是什么意思?谢谢
  • 打赏
  • 举报
回复
引用 45 楼 oreoconansisu 的回复:
1.想请教可否由浅入深的讲解如何根据执行计划做优化? 2.有时查看执行计划时,会显示'建议添加Index...‘,是否每次都要根据提示添加Index呢? 3.怎么根据执行计划中的'嵌套,合并,哈希'连接做优化 先谢谢了
都是好问题 1,这个要讲的太多了,可以用2本书来讲了,不过我简单的说一下思路, 首先,就像做备份跟还原一样,你不应该考虑如何做一个备份计划,还是应该考虑如何做一个还原计划,然后根据还原计划来建备份计划一样。 执行计划跟优化也是一样,你不应该首先考虑那个执行计划到底多不对,需不需要优化,还是应该考虑,你认为查询优化应该生成什么样的计划才是最好的, 比如说select * from table1 where id=100, 你觉得这个语句的计划,到底是table scan好还是index seek好,其实在你的心里早有了答案,如果你认为table scan比index seek更优,但是实际生成的计划确是index seek,这个时候你就要去调查,为什么没有生成table scan,你可以强制他们用table scan或者index seek,看看到底那个计划的COST更少,如果跟你想象的不一样,你就要考虑,为什么就这样,比如说你明明认为table scan的COST更少,但是在执行的时候你发现index seek的COST更少,这个时候你就要去调查为什么会这样,是不是statistics有问题? 之类的。 2,不一定,最明显的例子就是,比如说你那个查选只会运行一次,那肯定就没有必要加INDEX了, 另外,建议添加Index并不是最优的,比如说,Index可以包含包含索引跟非包含索引,很多情况下包含索引的性能比非包含的要好,但是建议添加Index一般不会给你包含索引的提示。 3,这个你要非常的清楚每种的'嵌套,合并,哈希'连接它背后的算法,时间复杂度,空间复杂度,以及它们的一些限制条件。 比如说合并它必须要求join的列都是排序的,如果没有排序那SQL 就会执行排序,所以这个时候的注意点就是不是有相关的INDEX建好了,这样可以避免排序带来的消耗。 。。。。。
oreoconansisu 2013-12-14
  • 打赏
  • 举报
回复
1.想请教可否由浅入深的讲解如何根据执行计划做优化? 2.有时查看执行计划时,会显示'建议添加Index...‘,是否每次都要根据提示添加Index呢? 3.怎么根据执行计划中的'嵌套,合并,哈希'连接做优化 先谢谢了
Neo_whl 2013-12-13
  • 打赏
  • 举报
回复
完全萌,帮顶!
-江沐风- 2013-12-12
  • 打赏
  • 举报
回复
帮顶一下!
Leon_He2014 2013-12-07
  • 打赏
  • 举报
回复
涨姿势了。。。。
flowerjack 2013-12-07
  • 打赏
  • 举报
回复
mark
天後2013 2013-12-07
  • 打赏
  • 举报
回复
statistics,cost模型我还没摸透呢。
加载更多回复(37)
本课程主要讲解如下内容:引言NumPy多维数组ndarrayNumPy创建数组1、KNN算法背景02、KNN中距离度量03、KNN分类算法流程04、手写KNN分类算法05、KNN回归算法流程 06 量化交易  量化交易是指以先进的数学模型替代人为的主观判断,利用计算机技术从庞大的历史数据中海选能带来超额收益的多种“大概率”事件以制定策略,极大地减少了投资者情绪波动的影响,避免在市场极度狂热或悲观的情况下作出非理性的投资决策。 定量投资和传统的定性投资本质上来说是相同的,二者都是基于市场非有效或弱有效的理论基础。两者的区别在于定量投资管理是“定性思想的量化应用”,更加强调数据。量化交易具有以下几个方面的特点: 1、纪律性。根据模型的运行结果进行决策,而不是凭感觉。纪律性既可以克制人性中贪婪、恐惧和侥幸心理等弱点,也可以克服认知偏差,且可跟踪。 2、系统性。具体表现为“三多”。一是多层次,包括在大类资产配置、行业选择、精选具体资产三个层次上都有模型;二是多角度,定量投资的核心思想包括宏观周期、市场结构、估值、成长、盈利质量、分析师盈利预测、市场情绪等多个角度;三是多数据,即对海量数据的处理。 3、套利思想。定量投资通过多面、系统性的扫描捕捉错误定价、错误估值带来的机会,从而发现估值洼地,并通过买入低估资产、卖出高估资产而获利。 4、概率取胜。一是定量投资不断从历史数据中挖掘有望重复的规律并加以利用;二是依靠组合资产取胜,而不是单个资产取胜。 量化投资技术包括多种具体方法,在投资品种选择、投资时机选择、股指期货套利、商品期货套利、统计套利和算法交易等领域得到广泛应用。在此,以统计套利和算法交易为例进行阐述。 1、统计套利 [1]  统计套利是利用资产价格的历史统计规律进行的套利,是一种风险套利,其风险在于这种历史统计规律在未来一段时间内是否继续存在。 统计套利的主要思路是先找出相关性most好的若干对投资品种,再找出每一对投资品种的长期均衡关系(协整关系),当某一对品种的价差(协整方程的残差)偏离到一定程度时开始建仓,买进被相对低估的品种、卖空被相对高估的品种,等价差回归均衡后获利了结。股指期货对冲是统计套利较常采用的一种操作策略,即利用不同国家、地区或行业的指数相关性,同时买入、卖出一对指数期货进行交易。在经济全球化条件下,各个国家、地区和行业股票指数的关联性越来越强,从而容易导致股指系统性风险的产生,因此,对指数间的统计套利进行对冲是一种低风险、高收益的交易方式。 2、算法交易。 算法交易又称自动交易、黑盒交易或机器交易,是指通过设计算法,利用计算机程序发出交易指令的方法。在交易中,程序可以决定的范围包括交易时间的选择、交易的价格,甚至包括most后需要成交的资产数量。 算法交易的主要类型有: (1) 被动型算法交易,也称结构型算法交易。该交易算法除利用历史数据估计交易模型的关键参数外,不会根据市场的状况主动选择交易时机和交易的数量,而是按照一个既定的交易方针进行交易。该策略的的核心是减少滑价(目标价与实际成交均价的差)。被动型算法交易most成熟,使用也most为广泛,如在国际市场上使用most多的成交加权平均价格(VWAP)、时间加权平均价格(TWAP)等都属于被动型算法交易。 (2) 主动型算法交易,也称机会型算法交易。这类交易算法根据市场的状况作出实时的决策,判断是否交易、交易的数量、交易的价格等。主动型交易算法除了努力减少滑价以外,把关注的重点逐渐转向了价格趋势预测上。 (3) 综合型算法交易,该交易是前两者的结合。这类算法常见的方式是先把交易指令拆开,分布到若干个时间段内,每个时间段内具体如何交易由主动型交易算法进行判断。两者结合可达到单纯一种算法无法达到的效果。 算法交易的交易策略有三:一是降低交易费用。大单指令通常被拆分为若干个小单指令渐次进入市场。这个策略的成功程度可以通过比较同一时期的平均购买价格与成交量加权平均价来衡量。二是套利。典型的套利策略通常包含三四个金融资产,如根据外汇市场利率平价理论,国内债券的价格、以外币标价的债券价格、汇率现货及汇率远期合约价格之间将产生一定的关联,如果市场价格与该理论隐含的价格偏差较大,且超过其交易成本,则可以用四笔交易来确保无风险利润。股指期货的期限套利也可以用算法交易来完成。三是做市。做市包括在当前市场价格之上挂一个限价卖单或在当前价格之下挂一个限价买单,以便从买卖差价中获利。此外,还有更复杂的策略,如“基准点“算法被交易员用来模拟指数收益,而”嗅探器“算法被用来发现most动荡或most不稳定的市场。任何类型的模式识别或者预测模型都能用来启动算法交易。  量化交易一般会经过海量数据仿真测试和模拟操作等手段进行检验,并依据一定的风险管理算法进行仓位和资金配置,实现风险most小化和收益most大化,但往往也会存在一定的潜在风险,具体包括: 1、历史数据的完整性。行情数据不完整可能导致模型与行情数据不匹配。行情数据自身风格转换,也可能导致模型失败,如交易流动性,价格波动幅度,价格波动频率等,而这一点是量化交易难以克服的。 2、模型设计中没有考虑仓位和资金配置,没有安全的风险评估和预防措施,可能导致资金、仓位和模型的不匹配,而发生爆仓现象。 3、网络中断,硬件故障也可能对量化交易产生影响。 4、同质模型产生竞争交易现象导致的风险。 5、单一投资品种导致的不可预测风险。 为规避或减小量化交易存在的潜在风险,可采取的策略有:保证历史数据的完整性;在线调整模型参数;在线选择模型类型;风险在线监测和规避等。 量化策略是指使用计算机作为工具,通过一套固定的逻辑来分析、判断和决策。量化策略既可以自动执行,也可以人工执行。 [2]  一个完整的量化策略包含哪些内容? 一个完整的策略需要包含输入、策略处理逻辑、输出;策略处理逻辑需要考虑选股、择时、仓位管理和止盈止损等因素。 选股 量化选股就是用量化的方法选择确定的投资组合,期望这样的投资组合可以获得超越大盘的投资收益。常用的选股方法有多因子选股、行业轮动选股、趋势跟踪选股等。 1 多因子选股 多因子选股是most经典的选股方法,该方法采用一系列的因子(比如市盈率、市净率、市销率等)作为选股标准,满足这些因子的股票被买入,不满足的被卖出。比如巴菲特这样的价值投资者就会买入低PE的股票,在PE回归时卖出股票。 2 风格轮动选股 风格轮动选股是利用市场风格特征进行投资,市场在某个时刻偏好大盘股,某个时刻偏好小盘股,如果发现市场切换偏好的规律,并在风格转换的初期介入,就可能获得较大的收益。 3 行业轮动选股 行业轮动选股是由于经济周期的的原因,有些行业启动后会有其他行业跟随启动,通过发现这些跟随规律,我们可以在前者启动后买入后者获得更高的收益,不同的宏观经济阶段和货币政策下,都可能产生不同特征的行业轮动特点。 4 资金流选股 资金流选股是利用资金的流向来判断股票走势。巴菲特说过,股市短期是投票机,长期看一定是称重机。短期投资者的交易,就是一种投票行为,而所谓的票,就是资金。如果资金流入,股票应该会上涨,如果资金流出,股票应该下跌。所以根据资金流向就可以构建相应的投资策略。 5 动量反转选股 动量反转选股方法是利用投资者投资行为特点而构建的投资组合。索罗斯所谓的反身性理论强调了价格上涨的正反馈作用会导致投资者继续买入,这就是动量选股的基本根据。动量效应就是前一段强势的股票在未来一段时间继续保持强势。在正反馈到达无法持续的阶段,价格就会崩溃回归,在这样的环境下就会出现反转特征,就是前一段时间弱势的股票,未来一段时间会变强。 6 趋势跟踪策略 当股价在出现上涨趋势的时候进行买入,而在出现下降趋势的时候进行卖出,本质上是一种追涨杀跌的策略,很多市场由于羊群效用存在较多的趋势,如果可以控制好亏损时的额度,坚持住对趋势的捕捉,长期下来是可以获得额外收益的。 择时 量化择时是指采用量化的方式判断买入卖出点。如果判断是上涨,则买入持有;如果判断是下跌,则卖出清仓;如果判断是震荡,则进行高抛低吸。  常用的择时方法有:趋势量化择时、市场情绪量化择时、有效资金量化择时、SVM量化择时等。 

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧