以缩小范围,便非常重要。如果我们只提供上限,就必须扫描并排序所有历史数据。所以如果
数据的采集频率很高,提供下限是有必要的。如果我们成功地把记录的“工作集”控制在可管理
的大小,就相当于回到了“少量历史记录”的情况。如果无法同时指定上限(例如当前日期)和
下限,我们的唯一希望就是根据数据项分区;我们只需在单一分区上cāo作,这比较接近“大结果
集”的情况。
结果集和别的数据存在与否有关
Result Set Predicated on Absence of Data
一个表中的哪些记录和另一个表中的数据不匹配?这种“识别例外”的需求经常出现。人们最常
想到的解决方案有两个:not in ()搭配非关联子查询,或者not exists()
搭配关联子查询。一般认为应该使用not exists。在子查询出现在高效搜索条件之后,使用not
exists是对的,因为高效过滤条件已清除大量无关数据,关联子查询当然会很高效。但当子查询
恰好是唯一条件时,使用not in比较好。
查找在另一个表无对应数据的记录时,会碰到一些奇特的解决方案。以下为实际例子,显示哪
些数据库查询代价最高。注意,问号是占位符(placeholder)或称为绑定变量(bind variable),
它们的具体值在后续执行中传递给查询:
insert into ttmpout(custcode,
suistrcod,
cempdtcod,
bkgareacod,
mgtareacod,
risktyp,
riskflg,
usr,
seq,
country,
rating,
sigsecsui)
select distinct custcode,
?,
?,
?,
mgtareacod,
?,
?,
usr,
seq,
country,
rating,
sigsecsui
from ttmpout a
where a.seq = ?
and 0 = (select count(*)
from ttmpout b
where b.suistrcod = ?
and b.cempdtcod = ?
and b.bkgareacod = ?
and b.risktyp = ?
and b.riskflg = ?
and b.seq = ?)
此例并非暗示我们无条件地认可临时表的使用。另外,我怀疑这个insert语句会被循环执行,通
过消除循环可以适当改善xìng能。
例子中出现了自参照(self-reference)很不常见的用法:对一个表的chā入cāo作,是以同一个表上
的select 为基础的。当前存在哪些记录?要创建的记录是否不存在?要chā入的记录是由