oralce的TIMESTAMP型字段作为关联条件

两个表,表A的内容是一个列表,表B的内容是其明细。

A表,表名:HEAD

B表,表名:DETAIL


HEAD表主键

字段            型

店铺代码    VARCHAR2(10)

番号1          NUMBER(2)

营业日        TIMESTAMP(6)

番号2         NUMBER(6)


DETAIL表主键

字段            型

店铺代码    VARCHAR2(10)

番号1          NUMBER(2)

营业日        TIMESTAMP(6)

番号2          NUMBER(6)

行番号        NUMBER(5)


HEAD表的数据量有上百万条,DETAIL表的数据量有上千万条,

两表关联,SQL如下:

SELECT
      --HEAD表
      H.AAA
      
      --DETAIL表
      D.BBB
 FROM
     HEAD H
     INNER JOIN
         DETAIL D
     ON  H.店铺代码      = D.店铺代码
     AND H.番号1         = D.番号1
     AND H.营业日        = D.营业日
     AND H.番号2         = D.番号2 
WHERE
     ROWNUM < 100000     
 ORDER BY
     H.营业日,
     H.店铺代码,
     H.番号1,
     H.番号2,
     D.行番号


因为如果不做ROWNUM 小于10万条的限制的话,结果会超过10万条,不便于分析。

上述语句执行的很久,后来将关联条件营业日做了如下调整,检索速度就上来了,

AND TO_CHAR(H.营业日, 'YYYYMMDD') = TO_CHAR(D.营业日, 'YYYYMMDD') --营业日


这么做的理由是,营业日虽然是TIMESTAMP型,但是实际存储的数据,是日期形式的,不包括时刻,即:

13-03-01 00:00:00.000000

所以,可以忽略时刻部分。


以下是完整的SQL语句:

SELECT
      --HEAD表
      H.AAA
      
      --DETAIL表
      D.BBB
 FROM
     HEAD H
     INNER JOIN
         DETAIL D
     ON  H.店铺代码      = D.店铺代码
     AND H.番号1         = D.番号1
     AND TO_CHAR(H.营业日, 'YYYYMMDD') = TO_CHAR(D.营业日, 'YYYYMMDD') --营业日
     AND H.番号2         = D.番号2 
WHERE
     ROWNUM < 100000     
 ORDER BY
     H.营业日,
     H.店铺代码,
     H.番号1,
     H.番号2,
     D.行番号


以上是在开发过程中,碰到一个问题,记录下来,不知道大家是否碰到和我类似的问题。

顺带说一句,当ROWNUM < = 1万的时候,上面两种方式的检索时间没多大差别。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值