没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
下载
第17章 优化SQL语句和存储过程
系统性能中一个非常重要的方面涉及应用中使用的 S Q L 语句。本章研究有效的应用设计、
查询设计和调整、索引设计和调整技术。最后,我们简要地看一下开放式数据库连接 ( o p e n
database connectivity)(ODBC)技术,你可以使用O D B C 技术在多次执行相同的S Q L 查询的应用
中获得较好的性能。
17.1 应用设计
一个高效的应用设计对系统的性能非常关键。如果你从第三方购买应用产品,检验实际
使用的数据库语句是十分困难或基本不可能的。如果你已经从本书的其他章节实现这些技术
和技巧,但是仍然发现存在性能问题,与你的应用提供商联系寻求帮助是十分明智的。
如果你的应用是自己设计开发或本国生产的,那么在优化应用和与其相关的查询上,就
具有更大的灵活性。考虑应用的一种方法是将它与客户作为一个控制实体看待。应用控制信
息流并指挥SQL Server数据库的行为。你的应用指示 SQL Server需要执行哪一条查询、何时执
行,以及如何处理结果。这反过来对锁的类型和周期、 I / O 总量以及服务器上加载的处理器
( C P U )又有重大的影响,因此影响性能通常好坏与否。
因此,在应用设计阶段做出正确的决定是非常重要的。一个设计良好的应用允许 S Q L
S e r v e r支持上千个并发用户。相反,一个设计拙劣的应用,即使使用最强大的服务器平台,也
只能处理为数不多的用户。
17.1.1 建议
必要时,可以很容易地分析并改正一些方面,以提高系统和在它上面运行的应用的性能。
你应该努力消除客户与 SQL Server系统之间过量的网络传输,网络上信息的来回旅程是会话
式的传输,在SQL Server与客户之间传送每个批处理和结果集。通常,你可以使用 SQL Server
存储过程以最小化信息的往复传输。我们在本章后面检验存储过程。
在应用中另外一个需要查看的方面是返回结果集的大小。你应该尽量最小化结果集的大
小,因为提取用于客户端浏览的不必要的大型结果集会增加处理器和网络 I / O 负担。大型返回
结果集还会减少应用远程使用的能力,并有可能限制多用户的可伸缩性。设计应用提示用户
进行充分输入,以便查询提交生成最合适的结果集,这是十分有意义的。你可以使用一些技
术控制返回结果集的大小。要了解有关正确调整结果集大小的详细信息,参见本章 1 7 . 4 节。
当创建查询时,不要过度使用通配符,例如 SELECT *。另外,应该强制性地确定一定的
输入域,以确保有足够的输入数据来构造一个更为有效的 S Q L 语句。你还要考虑使用诸如
TO P 、P E R C E N T 和SET ROWCOUNT这样的语句来限制查询返回的行的数量。最后,可以设
法从你的客户端系统中消除特定的查询。特定的查询一般构造拙劣,而且会返回远远超出需
要的行。消除特定的查询是一项相当有力的步骤,但它是一个选项。
一个经常被忽略的方面是提供允许用户取消查询和再次获得处理控制的应用特性。如果一
个用户或客户犯了一个错误,允许他们取消查询将消除系统上不必要的处理。一个简单的取消按
钮会为系统的性能创造奇迹。当忽略这个特性时,会导致难于发现和解决的性能问题。O D B C和
D B -库连接两者都提供了A P I用于查询取消。如果你确实允许取消一个查询,就应该保证应用执
行一个提交或回滚操作,以确保数据的完整性,因为取消一个查询不能自动地提交或回滚事务。
另外一种你可以使用的简单技术是,总是实行查询或锁超时。这种方法防止错误编写的
查询永无休止地执行,这在允许特定查询的环境中是一个常见问题。 SQL Server和O D B C提供
函数和语句以控制查询持续时间和锁超时。
另外一个高效应用设计的常用方面是应用生成工具的选择。虽然我们没有全面概括这些
工具的选择,但确实有一个关于它们特性的建议。一些应用生成工具不允许你显式地控制
S Q L语句的生成和发送给SQL Server。透明地生成S Q L 语句的工具听起来非常吸引人,但是它
们的确能够引发性能问题。这样的工具通常不提供查询取消、查询超时或全面事务控制的机
制。你可能经常遇到锁和事务阻塞而引发的问题,这些问题正如我们在其他章节中看到的那
样,对总体系统性能非常关键。
在可能时,尽量不要在应用中使用数据库游标。游标是非常有用的工具,但是比使用常
规的、面向集的 S Q L 语句需要更大的开销。在面向集的 S Q L 语句中,客户应用告诉服务器更
新满足特定标准的记录集。 SQL Server将算出如何作为一个单独的工作单元完成这个更新。
当通过一个游标进行更新时,客户应用要求服务器为每一行维护行锁或版本信息,以备客户
在行被取出后,要求更新这些行。
另外,使用游标意味着服务器正在维护客户状态信息,例如用户在服务器的当前行集。这
种状态信息通常在临时存储区中进行维护。在用户数量较少时,通常这不是一个问题。但是,
随着用户数量增长,维护这种状态信息就变为对宝贵的服务器资源的昂贵开销。一个更好的策
略是让客户应用快速地进入和退出,在调用之间,在服务器上不需要维护任何客户状态信息。
如果你发现必须要使用游标,就应该决定通过使用更为有效的游标类型,例如快速向前
游标,或通过使用一条单独的查询;是否能够将游标查询写得更为高效。我们在本章后面研
究高效游标使用技术。
你应该避免在同一个系统上混杂联机事务处理 ( O LT P ) 和决策支持查询。每种类型的工作
量都有不同的要求和功能,如果它们被安放到一个系统上,可能会引起竞争。我们建议有一
个或更多个系统用于 O LT P工作量,并有使用脱机数据的其他系统用于你的决策支持查询。决
策支持和O LT P系统在第1 2 章和第1 3 章中有详细讨论。
最后,你应该尽量让事务处理周期尽可能地短,以降低阻塞和提高并发性。一个长时间
运行的查询会阻塞其他的查询。一个影响许多行的D E L E T E或U P D AT E操作可能会获得多个锁,
甚至可能升级为表锁,这些锁可能会阻止其他事务的执行。你可以找出优化长时间运行查询
的方法,包括改变索引、将一个大的而且复杂的查询分离为简单的查询、或在脱机时间或在
一台独立的计算机上运行查询等方法。在 S Q L 存储过程中或在准备好的执行语句中执行 S Q L
语句也能够提高应用性能。通常,长时间运行的查询是决策支持查询。记住不要试图将决策
支持和联机事务处理查询混杂到同一个数据库中。
17.1.2 关键路径事务
在分析应用和查询前,你应该努力识别关键路径 (Critical Path)中的事务。关键路径事务
2 1 4 第四部分 优化S Q L语句
下载
是指这样的一类事务或数据库操作,如果它们执行拙劣或阻塞其他事务,能够最为严重地影
响你的系统。在你识别出关键事务或操作后,就可以轻易地将精力集中到能为你带来最大时
间投资回报的领域上来。
你能够用来分析关键事务的一个方法是画出执行矩阵。使用一个电子表格或坐标纸,在
左边列出关键事务或操作。接着为每个事务或操作,列出表和访问类型。你选择、插入、更
新或删除行吗?如果将多个表连接到一个事务中,也一定要注意。一旦将你的信息填入矩阵,
就可以分析它的并发性或寻找冗余数据存放的合理位置,例如,如果你找到一个位置,在那
里一个事务正进行一个大的连接,就可以有意义地将冗余数据放入一些表中以减轻连接的影
响。图1 7 - 1 是两个事务执行矩阵的一个例子。对于每个事务,只有那些被访问的列被显示出
来,这增加了例子的可读性。对于每一列,注明访问的类型,以及可能会发生的任何连接。
图17-1 一个执行矩阵
17.2 使用存储过程
我们认为大多数设计良好的 SQL Server应用都是使用存储过程开发的。存储过程允许你
在系统中重用查询,只需要简单地用名称指定它们并传入正确的参数即可。
简单地说,一个存储过程(Stored Procedure)是一组S Q L语句,能够编译成为一个单独的执
行计划。SQL Server存储过程可以通过输入参数接受输入,并能够以下面四种方式之一返回
数据:实际数据或游标变量的输出参数、一个整型返回码、对应每条 S E L E C T 语句的一个结果
集,或一个能够在存储过程环境外部被引用的全局游标。
存储过程允许你在全部应用中完成逻辑的一致性实现。需要执行一个正常运行任务的
S Q L 语句和逻辑可以一次性被设计、编码和测试,并被再次使用。需要执行该任务的每个应
用可以简单地执行该存储过程。另外,如果将商务逻辑编写到存储过程中,就能得到更大的
控制权,以确保你的客户正在使用你的商务规则和过程的最新版本。存储过程的使用允许你
将普通应用逻辑地从数据库布局中分离开来。如果你有一个存储过程,它能够为你的应用返
回一些值,就可以在不改变应用的情况下修改数据库布局和存储过程。只要你仍然返回预期
的数量和类型的值,那么应用代码将不必改变。
存储过程还可以提高性能。通常,一个应用将一个任务作为一系列 S Q L 语句执行。第一
条语句的输出为后续的 S Q L 语句提供数据,并且有一个条件表达式决定哪些 S Q L 语句将被执
行。如果你能够将这些 S Q L 语句和条件逻辑合并到一个存储过程中,它们就变为服务器上一
个单独的执行计划的一部分。这种概念在下面的 S Q L 代码例子中说明如下:
第1 7 章 优化S Q L 语句和存储过程 2 1 5
下载
剩余12页未读,继续阅读
syptodd
- 粉丝: 3
- 资源: 5
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- TG-2024-04-26-183849310.mp4
- 汇编语言的概要介绍与分析
- 个人博客系统设计与开发.zip
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0