优化SQL查询
的表现,我需要获取某些表中的所有ID在时间戳优化SQL查询
select Distinct PK1 from(
SELECT A.PK1
FROM T1 A , T2 B, T3 C, T4 D
WHERE TO_CHAR(A.DATE1,'YYYY-MM-DD HH24:MI:SS')>= '2016-06-01 00:00:00'
AND TO_CHAR(A.DATE1,'YYYY-MM-DD HH24:MI:SS') <= '2016-06-02 00:00:00' and a.PK2 is not null
AND A.PK2=B.PK2 AND B.PK3 IS NOT NULL AND B.PK3=C.PK3 AND C.PK4 IS NOT NULL
AND C.PK4=D.PK4 AND D.PK5 IS NOT NULL
union
SELECT A.PK1
FROM T1 a, T2 B , T3 C, T4 D
WHERE TO_CHAR(A.DATE2,'YYYY-MM-DD HH24:MI:SS')>= '2016-06-01 00:00:00'
AND TO_CHAR(A.DATE2,'YYYY-MM-DD HH24:MI:SS') <='2016-06-02 00:00:00' and a.PK2 is not null
AND A.PK2=B.PK2 AND B.PK3 IS NOT NULL AND B.PK3=C.PK3 AND C.PK4 IS NOT NULL
AND C.PK4=D.PK4 AND D.PK5 IS NOT NULL
UNION
select A.PK1
from T11 A, T1 B , T2 C, T3 D, T4 E WHERE
TO_CHAR(A.DATE1,'YYYY-MM-DD HH24:MI:SS')>='2016-06-01 00:00:00'
AND TO_CHAR(A.DATE1,'YYYY-MM-DD HH24:MI:SS')<='2016-06-02 00:00:00'
AND A.PK1=B.PK1 AND B.PK2 IS
NOT NULL AND B.PK2=C.PK2 AND C.PK3 IS NOT NULL AND C.PK3=D.PK3 AND D.PK4 IS NOT NULL
AND D.PK4=E.PK4 AND E.PK5 IS NOT NULL
UNION
select A.PK1
from T15 A , T1 B, T2 C, T3 D, T4 E WHERE
TO_CHAR(A.DATE1,'YYYY-MM-DD HH24:MI:SS')>='2016-06-01 00:00:00'
AND TO_CHAR(A.DATE1,'YYYY-MM-DD HH24:MI:SS') <='2016-06-02 00:00:00'
AND A.PK1=B.PK1 AND B.PK2 IS NOT NULL
AND B.PK2=C.PK2 AND C.PK3 IS NOT NULL AND C.PK3=D.PK3 AND D.PK4 IS NOT NULL
AND D.PK4=E.PK4 AND E.PK5 IS NOT NULL
UNION
select A.PK1
from T12 a, T6 b, T1 C, T2 D, T3 E, T4 F WHERE
TO_CHAR(b.DATE1,'YYYY-MM-DD HH24:MI:SS')>='2016-06-01 00:00:00'
AND TO_CHAR(b.DATE1,'YYYY-MM-DD HH24:MI:SS') <='2016-06-02 00:00:00' and A.PK6=b.PK6 AND A.PK1=C.PK1 AND
C.PK2 IS NOT NULL AND C.PK2=D.PK2 AND D.PK3 IS NOT NULL AND D.PK3=E.PK3
AND E.PK4 IS NOT NULL AND E.PK4=F.PK4 AND F.PK5 IS NOT NULL
UNION
select A.PK1
from T13 A, T7 b, T1 C, T2 D, T3 E, T4 F WHERE
TO_CHAR(b.DATE1,'YYYY-MM-DD HH24:MI:SS')>='2016-06-01 00:00:00'
AND TO_CHAR(b.DATE1,'YYYY-MM-DD HH24:MI:SS') <='2016-06-02 00:00:00'
and A.PK7=b.PK7 AND A.PK1=C.PK1 AND
C.PK2 IS NOT NULL AND C.PK2=D.PK2 AND D.PK3 IS NOT NULL AND D.PK3=E.PK3
AND E.PK4 IS NOT NULL AND E.PK4=F.PK4 AND F.PK5 IS NOT NULL
UNION
select A.PK1
from T13 A, T7 b, T1 C, T2 D, T3 E, T4 F WHERE
TO_CHAR(b.DATE2,'YYYY-MM-DD HH24:MI:SS')>='2016-06-01 00:00:00'
AND TO_CHAR(b.DATE2,'YYYY-MM-DD HH24:MI:SS') <='2016-06-02 00:00:00'
and A.PK7=b.PK7 AND A.PK1=C.PK1 AND
C.PK2 IS NOT NULL AND C.PK2=D.PK2 AND D.PK3 IS NOT NULL AND D.PK3=E.PK3
AND E.PK4 IS NOT NULL AND E.PK4=F.PK4 AND F.PK5 IS NOT NULL
UNION
select A.PK1
from T13 A, T7 b, T1 C, T2 D, T3 E, T4 F WHERE
TO_CHAR(b.DATE3,'YYYY-MM-DD HH24:MI:SS')>='2016-06-01 00:00:00'
AND TO_CHAR(b.DATE3,'YYYY-MM-DD HH24:MI:SS') <='2016-06-02 00:00:00'
and A.PK7=b.PK7 AND A.PK1=C.PK1 AND
C.PK2 IS NOT NULL AND C.PK2=D.PK2 AND D.PK3 IS NOT NULL AND D.PK3=E.PK3
AND E.PK4 IS NOT NULL AND E.PK4=F.PK4 AND F.PK5 IS NOT NULL
UNION
select A.PK1
from T14 a, T8 b, T1 C, T2 D, T3 E,
T4 F WHERE
TO_CHAR(b.DATE1,'YYYY-MM-DD HH24:MI:SS')>='2016-06-01 00:00:00'
AND TO_CHAR(b.DATE1,'YYYY-MM-DD HH24:MI:SS') <='2016-06-02 00:00:00' and A.PK8=b.PK8 AND A.PK1=C.PK1 AND
C.PK2 IS NOT NULL AND C.PK2=D.PK2 AND D.PK3 IS NOT NULL
AND D.PK3=E.PK3
AND E.PK4 IS NOT NULL AND E.PK4=F.PK4 AND F.PK5 IS NOT NULL
)
两者之间我的问题是我怎么能优化性能更好的查询。
您正在将日期转换为字符。如果您使用日期类型日期进行比较,并将日期列添加索引,则表现可能会增加。这些转换对于性能非常不利,并导致表扫描。
有没有其他方法可以消除联合? –
您可以使用OR,但这可能会降低您的表现。工会给你可能是最好的表现,看看你的执行计划,看看哪些列需要索引。我们不会深入了解您的复杂情况,看看它们是否可以简化,命名不是非常直观,我们也不能真正理解您在功能上试图完成的任务。 – Peter
在此处使用to_char将每行中的日期转换为字符集,然后将其与右侧的值进行比较。在代码的顶部,将右侧的值转换为datetime,并直接将其与日期类型的列进行比较。这会让它更快。
此外,您可以查看估计的查询执行路径,并最小化单个步骤的成本。
感谢您的意见 –
我还附加了表结构 –
首先您应该考虑使用'JOIN'而不是旧的SQL-89 ANSI语法 – sle1306