- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
26.1.10 存储过程的优化 p543 当存储过程第一次执行的时候,它的语法树装载到存储过程缓冲区,然后优化器生成一查询计划, 执行完成后,只要有空间,存储过程仍保存在缓冲区中, 存储过程是不可再重入的,即每一时间只有一个用户使用, 多个用户可以同时执行存储过程,每个用户取得自己的查询计划, 如果缓冲区中没有空闲的拷贝,则用户使用一个最新优化的查询计划。 使用with recompile执行时,存储过程缓冲区中就会加进一个新的查询计划。 优化存储过程 在缺省情况下优化时就基于第一次运行时提供的值 这种方式有时不是最好选择,例如下面的存储过程: CREATE PROCEDURE GetBooksInPriceRange (@low money, @high money) as SELECT title,price FROM titles WHERE price BETWEEN @low and @high 第一次执行存储过程GetBooksInPriceRange 0.0 100.0,因为执行大范围的查询,使用了全表扫描的方式再执行GetBooksInPriceRange 19.95 29.95时,因为选择范围小,使用索引也许性能更好,所以应该使用不同的查询计划, 使用下面的方式可以改变缺省值: ·create procedure with recompile 这时存储过程在每次执行时都要重新优化,生成新的查询计划, 它的缺点是有时会浪费时间。 ·execute procedure with recompile 它在执行存储过程时会重新生成查询计划, 这在怀疑优化不是根据当前值进行时有用 ·sp_recompile table_name 它使得所有使用该表的存储过程在下次运行时重新编译 小结 or与in子句优化 索引覆盖 集合函数优化 order by优化 连接操作优化 子查询优化 存储过程优化 练习 练习\ex2602.SQL 目标 了解各种查询的优化 任务 or与in子句优化 索引覆盖 集合函数优化 order by优化 连接操作优化 子查询优化 存储过程优化 26.1.11 修改操作的优化 三种直接修改模式,一种延迟修改模式 1、就地修改-(in-place) p544 在就地修改中,页中其它行不移动, RID号与在行偏移量表的指针都不发生变化。 In-Place Direct Updates update titles set pubdate = Jun 11 1992 where title_id = BU1032 若要执行就地修改必须满足 被修改的数据行的长度不能改变。 修改的列不能是一聚集索引的Key值,因为修改key值相当于数据行的位置发生变化。 索引必须是唯一的,不能允许重复值。 修改语句不能包含连接。 修改的列没有用作参照完整性。 在列上没有触发器。 该表没有通过Replication Server复制过 2、廉价的直接修改 p545 是指在页中相同偏移量的地方重新写入,页中其它行相应移动以保持页中数据的连续性,但是RID保持不变,行偏移量表的指针相应变化以反映新位置。 要执行廉价直接修改必须满足 数据的长度可以改变,但数据行不能超出原数据页或者数据行长度不改变,但是表上有触发器或表被复制过。 修改的列不能是一聚集索引的码值,因为修改码值相当于数据行的位置发生变化。 索引必须是唯一的,不能允许重复值。 修改语句不能包含连接。 修改的列没有用作参照完整性。 廉价直接修改,SQL Server对数据页要做两个修改(行与偏移量表)。因为数据页和行 ID都没有变化,它只需修改由于主码变化所影响的索引。 where子句的某些结构可以转化为SARG between谓词可以转化为=and=子句,比如: price between 10 and 20 可以转化为 price= 10 and =20 like子句中匹配值的第一个字符是常量,也可以进行转换 例如 like “sm%”可以转换成 =“sm”and “sn” 但like “%x”这种类型不能转换 使用一些冗余的SARG给优化器更多的信息 表titles和表titleauthor是一对多的关系,title_id在表titles中是唯一的。 1. select au_lname ,title from titles t, titleauthor ta, authors a where t.title_id = ta.title_id
文档评论(0)