者来说,研究上述技巧有利于对查询内部工作原理的深入了解,常常使你受益匪浅。
总结:当视图返回不必要的元素时,别把视图内嵌在查询中,而是应将视图分解,将其组成部
分加到查询主体中。
并发用户数
Number of other Users
最后,在设计 SQL 程序时,并发性(concurrency)是个必须认真对待的因素。写数据库时需
要关注并发性:是否存在数据块访问争用(block…access contention)、阻塞(locking)、或闩
定(latching)(DBMS内部资源阻塞)等重要问题;甚至有时,为保证读取一致性(read
consistency)也会导致某种程度的资源争用。任何服务器的处理能力都是有限的,不管其说明
书有多令人震撼。在机器相同的情况下,很少并发或没有并发操作时设计可能是完美的,但对
有大量并发操作的情况未必完美。排序操作可能没有足够内存可用,于是转而求助于磁盘,引
发了新的资源争用……一些计算密集型(CPUintensive)操作——例如负责复杂计算的函数、
索引区块的重复扫描,均可引起计算机负荷过多。我遇到过一些案例,增加物理 I/O 会使任务
执行效率更高,因为其中计算密集操作的并发执行程度很高,一个进程刚因等待 I/O 而阻塞,
被释放的CPU就被另一个进程占用了,这样一来CPU资源就被充分利用了。一般而言,我们必
须考虑特定商业任务的整体吞吐量(throughput),而不是个别用户的响应时间(response…time)。
…………………………………………………………Page 38……………………………………………………………
注意
第9章将更详细地探讨并发性。
过滤
Filtering
如何限定结果集是最关键的因素之一,有助于你在编写 SQL 语句时判断该用哪些技巧。用来
过滤数据的所有准则,通常被视为是 where 子句中各种各样的条件,我们必须认真研究各种
where 子句(及 having 子句)。
过滤条件的含义
Meaning of Filtering Conditions
若从SQL语法来看,where子句中表达的所有过滤条件当然大同小异。但事实并非如此。有些
过滤条件通过关系理论直接作用于select 运算符:where子句检查记录中的字段是否与指定条
件相符。但其实,where 子句中的条件还可以使用另一个关系运算符 join。自从 SQL92 出现
join 语法后,人们就试图将“join过滤条件”(位在主 from 子句和 where 子句之间)和“select
过滤条件”(位于where子句内)区分开来。从逻辑上讲,连接两个(或多个)表建立了新的关
系。
下面是个常见的连接(join)的例子:
select 。。。。。
from t1
inner join t2
on t1。join1 = t2。joind2
where 。。。
假设表t2中有一字段c2,该不该把 c2上的条件当作 inner join 的额外条件呢?即是否应认为参
与连接的不是“t2表”而是“t2表的子集”呢?或者,假设where 子句中有一些关于t1 字段的条件,
那么这些条件是否会应用到 t1 连接 t2 的结果呢?连接条件放在何处应该都一样,然而其运
行效率却会因优化器不同而异。
除了连接条件和简单的过滤条件之外,还有其他种类的条件。例如,规定返回的记录集为某种
子类型的条件,以及检查另一个表内是否存在特定数据的条件。虽然从 SQL 语法上看它们相
似,但在语义上却未必完全相同。有时条件的计算顺序无足轻重,但有时却影响重大。
下面的例子说明了条件计算顺序的重要性,实际上,在许多商用软件包中都能找到这样的例子。
假设有个 parameters 表,它包含字段:parameter_name、parameter_type、
parameter_value,无论由parameter_type定义了什么参数属性,其中 parameter_ value 均以
字符串表示。(从逻辑上来说,上述情况堪比罗密欧与茱莉叶的悲剧,因为属性parameter_value
所表示的领域类型非常多,所以违反了关系理论的主要规则。)假设进行如下查询:
select * from parameters
…………………………………………………………Page 39……………………………………………………………
where parameter_name like"%size"
and parameter_type = "NUMBER"
在这个查询中,无论先计算两个条件中的哪一个,都无关紧要。然而,如果增加了以下条件,
计算的顺序就变得非常重要了,其中int()是将字符转换为整数值的函数:
and int(parameter_value) 》 1000
这时,parameter_type上的条件必须先计算,而parameter_value上的条件后计算,否则会因为
试图把非数字字符串转换为整数,而造成运行时错误(假设 parameter_ type字段的类型定义
为char)。如果你无法向数据库说明这一点,那么优化器也无从知道哪个条件应该有较高的优先
权。
总结:查询条件是有差异的,有的好,有的差。
过滤条件的好坏
Evaluation of Filtering Conditions
编写 SQL 语句时,应首先考虑的问题是:
哪些数据是最终需要的,这些数据来自哪些表?
哪些输入值会传递到 DBMS 引擎?
哪些过滤条件能滤掉不想要的记录?
然而要清楚的是,有些数据(主要是用来连接表的数据)可能冗余地存储在几个表中。所以,
即使所需的返回值是某表的主键,也不代表这个表必须出现在from子句中,这个主键可能会以
外键的形式出现在另一个表中。
在编写查询之前,我们甚至应该对过滤条件进行排序,真正高效的条件(可能有多个,涉到不
同的表)是查询的主要驱动力,低效条件只起辅助作用。那么定义高效过滤条件的准则是什么
呢?首先,要看过滤条件能否尽快减少必须处理的数据量。所以,我们必须倍加关注条件的编
写方式,下面通过例子说明这一点。
蝙蝠车买主
假设有四个表: customers、orders、orderdetail、articles,如图4…5所示。注意,图中各表的
方框大小不同,这代表各表的数据量大小,而不代表字段数量;加下划线的字段为主键。
现在假设 SQL 要处理的问题是:找出最近六个月内居住在Gotham市、订购了蝙蝠车的所有客
户。当然,编写这个查询有多种方法,ANSISQL的推崇者可能写出下列语句:
select distinct c。custname
from customersc
join orders o
on o。custid = c。custid
join orderdetail od
on od。ordid = o。ordid
…………………………………………………………Page 40……………………………………………………………
join articles a
on a。artid = od。artid
where c。city= "GOTHAM"
and a。artname = "BATMOBILE"
and o。ordered 》= somefunc
其中,somefunc是个函数,返回距今六个月前的具体日期。注意上面用了distinct,因为考虑到
某个客户可以是大买家,最近订购了好几台蝙蝠车。
暂不考虑优化器将如何改写此查询,我们先看一下这段代码的含义。首先,来自customers表的
数据应只保留城市名为 Gotham 的记录。接着,搜索orders表,这意味着custid字段最好有索
引,否则只有通过排序、合并或扫描orders表建立一个哈希表才能保证查询速度。对orders表,
还要针对订单日期进行过滤:如果优化器比较聪明,它会在连接(join)前先过滤掉一些数据,
从而减少后面要处理的数据量;不太聪明的优化器则可能会先做连接,再作过滤,这时在连接
中指定过滤条件利于提高性能,例如:
join orders o
on o。custid = c。custid
and a。ordered 》= somefunc
即使过滤条件与连接(join)无关,优化器也会受到过滤条件的影响。例如,若orderdetail的主
键为(ordid; artid),即ordid为索引的第一个属性,那么我们可以利用索引找到与订单相关的记
录,?
小说推荐
- C语言实例教程(PDF格式)
- -Page 1-前 言Visual C+是开发运行于Windows 95和Windows NT环境下的Win32应用程序的可视化编程工具中最重要的成员之一,它为软件开发人员提供了完整的编辑、编译和调试工具和建立于Win32 API(ApplicationProgramming Interface)基
- 其他
- 最新章:第143章
- SQL 21日自学通(V3.0)(PDF格式)
- -Page 1-SQL 21 日自学通(V1.0 翻译人 笨猪目录目录 1译者的话 14第一周概貌 16从这里开始 16
- 其他
- 最新章:第170章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 其他
- 最新章:第4章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 其他
- 最新章:第28章
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 其他
- 最新章:第37章
- 深入浅出MFC第2版(PDF格式)
- -Page 1-Page 2-山高月小山高月小 水落石出水落石出山高月小山高月小 水落石出水落石出-Page 3-深入淺出MFC(第版 使用Visual C 5.0 MFC 4.2)Dissecting MFC(Second Edition Using Visual C 5.0 MFC 4.2)侯俊
- 其他
- 最新章:第309章
- 软件工程实践者的思想(PDF格式)
- -Page 1-大 道 至 简—软件工程实践者的思想周爱民(Aimingoo 著-Page 2-序2004 年 11 月初爱民(Aimingoo)第一次把他的书稿给我,我翻看了一下,第一反应讲的是感想。这不错,在技
- 其他
- 最新章:第26章
- VB2008从入门到精通(PDF格式英文版)
- -Page 1(R)The eXperT’s Voice inBeginningVB 2008From Novice to ProfessionalChristian Gross-Page 2-Page 3-Beginning VB 2008From Novice to Professional■C
- 其他
- 最新章:第214章
- 电子电路大全(PDF格式)
- -Page 1-电力生产人员技能培训电路基础部分电路基础部分电电路路基基础础部部分分-Page 2-一、电路的基本概念和基本定律-Page 3-考试点1o 1、掌握电阻、独立电压源、独立电流源、11受控源、电容、电感、耦合电感、理想变压器诸元件的定义、性质2o 2、掌握电流、电压参考方向的概念223
- 其他
- 最新章:第353章