SQL 21日自学通(V3.0)(PDF格式)-第62部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
SQL》 SET TIMING ON
2 SELECT COUNT(*)
3 FROM FACT_TABLE
4 WHERE CALC_YTD = '…2109490。8'
5 AND DT_STMP = '01…SEP…96'
6 AND OUTPUT_CD = '001'
7 AND ACTIVITY_CD = 'IN'
8 AND STATUS_CD = 'A'
9 AND FUNCTION_CD = '060';
OUTPUT
COUNT(*)
8
1 row selected。
Elapsed: 00:00:15。37
INPUT/OUTPUT
312
…………………………………………………………Page 313……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 SET TIMING ON
2 SELECT COUNT(*)
3 FROM FACT_TABLE
4 WHERE FUNCTION_CD = '060'
5 AND STATUS_CD = 'A'
6 AND ACTIVITY_CD = 'IN'
7 AND OUTPUT_CD = '001'
8 AND DT_STMP = '01…SEP…96'
9 AND CALC_YTD = '…2109490。8';
OUTPUT
COUNT(*)
8
1 row selected。
Elapsed: 00:00:01。80
分析
注意所使用的时间的不同 只要简单地改变所给出的统计的次序 第二个查询比第一
个查询快了 14 秒 那么可以设想一下当查询的结构设计不好的时候耗用几个小时的情形
过程
如果所使用的查询有规律可循 那么你可以试着使用过程 过程可以调用很大的一组
SQL 的语句 参见第 13 天 高级 SQL 主题
过程是被数据库的引擎编译后运行的 与 SQL 语句不同 数据库引擎在执行过程的时
候不需要进行优化 过程相对于独立的多个 SQL 语句 它对于用户来说更容易使用而对于
数据库来说更为有效
避免使用 OR
如果可能的话应该在查询尽量避免使用逻辑操作符 OR OR 会不可避免的根据表的大
小降低查询的速度 我们发现 IN 通常比 OR 要快 当然 优化器的文档中并不是这样说的
可是 下边的例子中使用了多个 OR
313
…………………………………………………………Page 314……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
INPUT
SQL》 SELECT *
2 FROM FACT_TABLE
3 WHERE STATUS_CD = 'A'
4 OR STATUS_CD = 'B'
5 OR STATUS_CD = 'C'
6 OR STATUS_CD = 'D'
7 OR STATUS_CD = 'E'
8 OR STATUS_CD = 'F'
9 ORDER BY STATUS_CD;
下边是使用子串和 IN 写成的相同的查询
INPUT
SQL》 SELECT *
2 FROM FACT_TABLE
3 WHERE STATUS_CD IN ('A';'B';'C';'D';'E';'F')
4 ORDER BY STATUS_CD;
分析
你可以自己进行一些类似的测试 尽管书中的代码是最为标准和直接的 但是你会发
现你经常可以得到你自己的结论 特别是在性能方面
下边是使用子串和 IN 的又一个例子 注意 第一个查询结合使用了 LIKE 和 OR
INPUT
SQL》 SELECT *
2 FROM FACT_TABLE
3 WHERE PROD_CD LIKE 'AB%'
4 OR PROD_CD LIKE 'AC%'
5 OR PROD_CD LIKE 'BB%'
6 OR PROD_CD LIKE 'BC%'
7 OR PROD_CD LIKE 'CC%'
8 ORDER BY PROD_CD;
314
…………………………………………………………Page 315……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 SELECT *
2 FROM FACT_TABLE
3 WHERE SUBSTR(PROD_CD;1;2) IN ('AB';'AC';'BB';'BC';'CC')
4 ORDER BY PROD_CD;
第二个例子不仅避免的使用 OR 而且也避免了使用 LIKE 与 OR 的联合操作 你可以
试一下这个例子 你会看到对于你的数据它们在实际运行时性能上的不同
OLAP 与 OLTP 的比较
当你在调试一个数据库的时候 你首先要决定的是它应该经常由谁来使用 在线的分
析处理 OLAP 的数据库是一个对最终用户的查询进行统计和汇总的系统 在这种环境
下返回的数据经常用与统计报告给决策管理过程提供帮助 而在线事务过程 OLTP 的数
据库则是一个将主要的功能提供给为最终用户输入服务的环境的系统 包括用户日复一日
的查询 OLTP 系统经常用在以日为基本单位在数据库中操作数据的使用场合 数据仓库
与 DSS 可以从在线的事务处理数据库中得到它们所需的数据 有时也可以从其它的 OLAP
数据库中得到数据
OLTP 的调试
一个事务处理数据库是一个精密的系统 它的访问任务是由繁重的按日而定的大量的
事务与查询组成 但是 OLTP 通常不需要巨大的分类区域 至少它的需要没有 OLAP 的
那么大 大多数 OLTP 的反应很迅速但是不会进行分类
在事务处理数据库中最明显的例子就是 ROLLBACK 语句 需要撤消的内容的量与尺
寸是与当前有多少用户在访问数据库相关的 与在每一个事务中进行的工作一样 最好的
办法是在一个事务处理的环境中有多个 ROLLBACK 命令
在事务处理环境中另一个涉及的问题是事务历史记录的完整性 它在每一个事务结束
后都会写出 LOGS 是为恢复的目的而存在的 所以 每一种 SQL 解释器都需要有一种方
法来对 LOGS 进行备份以用于 恢复点 SQL SERVER 使用的是 DUMP DEVICE ORACLE
则使用一种被称为 ARCHIVELOG 模式的数据库 事务记录也会涉及到性能 因为对记录
的备份是额外的负荷
315
…………………………………………………………Page 316……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
OLAP 的调试
如果要调试 OLAP 系统 例如数据仓库或决定支持的系统 与调试 OLTP 系统有着相
当大的不同 一般说来 它需要较大的空间用以进行分类
由于这种系统的目的是获得有用的用以决策的数据 所以你可以想象得到它有着相当
多的复合查询并且通常要涉及到对数据的分组和排序 与事务处理数据库相比较而言
OLAP 系统是将较多的空间用于对数据的分类和排序而把较少的空间用于撤消区域的代
表
在 OLAP 系统中的大多数事务是作为批处理进程中的一部分存在的 代之以为用户输
入提供大量的输入撤消区域 你会采用一个很大的撤消区域用以加载 这样可以实现离线
工作以减少工作负荷
批量载入与事务处理进程
对于 SQL 语句和数据库而言的一个重要的性能因素是处理的类型和它在数据库中所占
用的空间 一种处理类型为 OLTP 它已经在今天的早些时候讨论过了 当我们谈到事务
处理过程时 我们是指两种输入方法 用户输入和批量载入
正常情况下用户的输入是由 INSERT UPDATE DELETE 语句组成的 这种类型的事
务其性能通常是依据最终用户或客户而定的 最终用户通常使用前端应用程序如
PowerBuilder 来与数据库进行交互 所以他们很少能够看到 SQL 语句 然而 SQL 代码仍
然通过他们所使用的前端应用程序产生了
当我们优化数据库的性能时我们的重点应该在最终用户的事务上 毕竟 没有用户
就是 没有数据库 你也将会失业 你一定要力争让你的用户感到高兴 即使他们对数据
库或系统的期望有些时侯是不合情理的 对最终用户需要考虑的是最终用户输入的并发数
量 在你的数据库中用户并发操作越多 数据库性能下降的可能性就越大
什么是批量载入呢 批量载入就是在一次事务中完成对数据库所进行的任务 例如
如果你想把上一年的记录存入一个很大的历史表中 你需要在你的历史表中插入成千上万
条的记录 你大概不想手工来完成这个工作 所以你会创建一个批任务或是一个脚本来自
动完成这个工作 对于批量装入数据是有很多的技术可以使用的 批量载入由于它对系统
资源和数据库资源占用而名声不好 这些数据库资源包括表的访问 系统目录的访问 数
316
…………………………………………………………Page 317……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
据库回退 和排序空间 系统资源则包括 CPU 和共享内存的占用 根据你所使用的操作系
统和数据库服务 可能还有许多麻烦的工作
最终用户事务与批量载入对于大多数数据库来说是成功的必备 但是当这两种类型的
过程死锁时你的数据库系统会面临严重的性能考验 所以你应该知道它们之间的不同 如
果可能最好对它们进行隔离 例如 当最终用户活动处于高峰时你不应该向数据库中装入
大量的的数据 数据库的响应会因为并发用户的增多而变慢 你要在最终用户访问最少的
时候执行批量载入任务 许多公司都选择在夜间或是早上执行批量载入任务以避免与日间
的进程产生冲突
对于大量的批量载入你一定要安排好时间 要认真的避开数据库可能进行常规用户访
问的时间 下表给出的当重载批处理任务进行时又有多个用户进行访问所引出资源引用冲
突的情况
正如你所看到的 许多进程在争用的系统的资源 重载的批处理任务已经打破了这种
平等的情况 系统将不能为每一个用户平均地分配资源 批处理任务已经大量地占用了它
们 这种情况只是资源争夺的开始 如果批处理任务进行下去 用户的进程可能会在最后
被迫退出这副图 这在生意上是非常不利的 即使系统中只有一个用户 这种竞争也还是
会出现
使用批处理进程的另外一个问题是当另一个用户访问它所访问的表时可能会死锁 如
果一个表被锁住了 用户将会被拒绝访问直到批处理进程解除对该表的锁定 这可能会是
几个小时的时间 如果可能 批处理进程应该是系统处理最佳的时候发生 不要让用户与
批处理进程进行竞赛 没有人会在这样的比赛中获胜
317
…………………………………………………………Page 318……………………………………………………………
SQL 21 日自学通(V1。0)