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