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

    个问题决定的。

    使用count(*) 测试某些数据是否存在是个糟糕的主意:为此DBMS 必须搜索并找出所有相符

    的记录。其实,此时应该使用exists,它会在遇到第一个相符数据时就停止。当然,如果过滤

    条件是主键,使用count或exists的差别不大,否则差异极大——无论如何,从语义角度讲,若想

    表达:

    and not exists (select 1 ...)

    不能换成:

    and 0 = (select count(*) ...)

    使用count(*)时,优化器“可能”会进行合理的优化——但未必一定如此。记录的数量若通过独立

    步骤被计入某个变量,优化器肯定不会优化,因为优化器再聪明也无法猜测计数的用途:count()

    的结果可能是极重要的值,而且必须显示给最终用户!

    然而,当我们只想建立一条新记录,且新记录要从已存在于表中的记录推导出来时,正确的做

    法是使用诸如except(有时称为minus)这样的集合cāo作符(set operator)。

    insert into ttmpout(custcode,

    suistrcod,

    cempdtcod,

    bkgareacod,

    mgtareacod,

    risktyp,

    riskflg,

    usr,

    seq,

    country,

    rating,

    sigsecsui)

    (select custcode,

    ?,

    ?,

    ?,

    mgtareacod,

    ?,

    ?,

    usr,

    seq,

    country,

    rating,

    sigsecsui

    from ttmpout

    where seq = ?

    except

    select custcode,

    ?,

    ?,

    ?,

    mgtareacod,

    ?,

    ?,

    usr,

    seq,

    country,

    rating,

    sigsecsui

    from ttmpout

    where suistrcod = ?

    and cempdtcod = ?

    and bkgareacod = ?

    and risktyp = ?

    and riskflg = ?

    and seq = ?)

    集合cāo作符的重大优点是彻底打破了“子查询强加的时间限制”,无论子查询是关联子查询还是

    非关联子查询。打破“时间限制”是什么意思?当存在关联子查询时,就必须执行外层查询,接

    着对所有通过过滤条件的记录,执行内层查询。外层查询和内层查询相互依赖,因为外层查询

    会把数据传递给内层查询。

    使用非关联子查询时情况要好得多,但也不是完全乐观:必须先完成
上一页 目录 下一页