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万的时候,上面两种方式的检索时间没多大差别。

posted @ 2017-03-02 17:52  吃蒜苔的羊  阅读(198)  评论(0)    收藏  举报