字体
第(1/6)页
关灯
   存书签 书架管理 返回目录
    种情况下,使用正规连接、关联子查询,还是非关联子查询,

    要根据不同条件的过滤能力和已存在哪些索引而定。

    例如,由于不太畅销,我们不再检索订购蝙蝠车的人,而是查找上周六购买某种肥皂的客户。

    此时,我们的查询语句为:

    select distinct orders.custid

    from orders

    join orderdetail

    on (orderdetail.ordid = orders.ordid)

    join articles

    on (articles.artid = orderdetail.artid)

    where articles.artncom = 'SOAP'

    and

    这个处理流程很合逻辑,该逻辑和商品具有高可选择xìng时相反:先取得商品,再取得包含商品

    的明细订单,最后处理订单。对目前讨论的肥皂订单的情况而言,我们应该先取得在较短期间

    内下的少量订单,再检查哪些订单涉及肥皂。从实践角度来看,我们将使用完全不同的索引:

    第一个例子需要orderdetail表的商品名称、商品ID这两个字段上的索引,以及orders表的主键

    orderid上的索引;而此肥皂订单的例子需要orders表日期字段的索引、orderdetail表的订单ID字

    段的索引,以及articles表的主键orderid上的索引。当然,我们首先假设索引对上述两例都是最

    佳方式。

    要知道哪些客户在上星期六买了肥皂,最明显而自然的选择是使用关联子查询:

    select distinct orders.custid

    from orders

    where

    and exists (select 1

    from orderdetail

    join articles

    on (articles.artid = orderdetail.artid)

    where articles.artncom = 'SOAP'

    and orderdetails.ordid = orders.ordid)

    在这个方法中,为了使关联子查询速度较快,需要orderdetail表的ordid字段上有索引(就可以

    通过主键artid取得商品,无需其他索引)。

    第3章已提到,事务处理型数据库(transactional database)的索引是种奢侈,因为它处在经常更

    改的环境中,维护的成本很高。于是选择“次佳”解决方案:当表orderdetail 上的索引并不重要,

    而且也有充足理由不再另建索引时,我们考虑以下方式:

    select distinct orders.custid

    from orders,

    (select orderdetails.ordid

    from orderdetail,

    articles

    where articles.artid = orderdetail.artid

    and articles.artncom = 'SOAP') as su
上一章 目录 下一页