字体
第(4/6)页
关灯
   存书签 书架管理 返回目录


    以缩小范围,便非常重要。如果我们只提供上限,就必须扫描并排序所有历史数据。所以如果

    数据的采集频率很高,提供下限是有必要的。如果我们成功地把记录的“工作集”控制在可管理

    的大小,就相当于回到了“少量历史记录”的情况。如果无法同时指定上限(例如当前日期)和

    下限,我们的唯一希望就是根据数据项分区;我们只需在单一分区上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ā入的记录是由
上一页 目录 下一页