2017-07-04 147 views
-3

的表现,我需要获取某些表中的所有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 

) 

两者之间我的问题是我怎么能优化性能更好的查询。

+1

我还附加了表结构 –

+0

首先您应该考虑使用'JOIN'而不是旧的SQL-89 ANSI语法 – sle1306

回答

2

您正在将日期转换为字符。如果您使用日期类型日期进行比较,并将日期列添加索引,则表现可能会增加。这些转换对于性能非常不利,并导致表扫描。

+0

有没有其他方法可以消除联合? –

+0

您可以使用OR,但这可能会降低您的表现。工会给你可能是最好的表现,看看你的执行计划,看看哪些列需要索引。我们不会深入了解您的复杂情况,看看它们是否可以简化,命名不是非常直观,我们也不能真正理解您在功能上试图完成的任务。 – Peter

0

在此处使用to_char将每行中的日期转换为字符集,然后将其与右侧的值进行比较。在代码的顶部,将右侧的值转换为datetime,并直接将其与日期类型的列进行比较。这会让它更快。

此外,您可以查看估计的查询执行路径,并最小化单个步骤的成本。

+0

感谢您的意见 –