我有一个方案,要多次连接同一张表,以获得所需的输出。例如,我有两个表TABLE A和TABLE B。
我写了一个这样的查询,但是由于我们要多次浏览同一个表(TABLEB),而且TABLEB有几百万行,所以查询的运行需要很多时间。有什么办法可以让我们以不同的方式重写这个查询。Could some one can help with this me.
SELECT
ident.mid mid1,
b.mid mid2
FROM
(
SELECT
*
FROM
tableb
WHERE
midtype = 130307
) ident
INNER JOIN (
SELECT
s.cid,
s.mid,
s.midtype
FROM
(
SELECT
cid,
partyid,
admin_sys_tp_cd,
mid,
ilast
FROM
(
SELECT
cq.cid,
RANK() OVER(
PARTITION BY cq.partyid
ORDER BY
cq.idate ASC
) rnk,
cq.idate,
cq.partyid,
i.mid,
i.idate AS ilast
FROM
tablea cq
INNER JOIN tableb i ON cq.cid = i.cid
INNER JOIN tablec ON i.cid = c.cid
WHERE
i.midtype = 130300
)
WHERE
rnk = 1
) a
INNER JOIN (
SELECT
*
FROM
(
SELECT
cid,
mid,
midtype,
RANK() OVER(
PARTITION BY mid
ORDER BY
idate DESC
) rnk_mpid
FROM
tableb
)
WHERE
rnk_mpid = 1
) s ON a.mid = s.mid
AND s.midtype = 130300
) b ON ident.cid = b.cid
AND ident.midtype = 130307
不是你所问的,但在别人和我,花时间为你争取不同的方法之前,让我们确保基本的东西都被覆盖。
无论你能写出多么不同的SQL查询,如果你没有合适的索引,它们永远不会快速执行,在一个MILLION基表中。 特别是你的情况,因为你至少要访问它3次。
只是通过看你的详细步骤。我想说的是,你应该至少创建3个不同的索引来支持这个查询。
TableA_Index1 ( PARTYID, LDATE, INCLUDES CID)
TableB_Index1 (CID, MIDTYPE, INCLUDES MID )
TableB_Index2 (MID, LDATE, INCLUDES CID )
你有这些索引吗?你有没有试过在 db2-advisor (db2advis) 上运行这个查询,以获得推荐的索引?