|
把我最后的四表连接改用11GR2的递归WITH实现,consistent gets从3360下降到22, 虽然执行时间没有什么差别。
WITH c1 AS (
SELECT ROWNUM id, MOD(ROWNUM-1,7)+1 x,CEIL(ROWNUM/7) y FROM DUAL CONNECT BY ROWNUM<=49
)
,cells AS (
SELECT c1.id,c1.x,c1.y
,REPLACE(SYS_CONNECT_BY_PATH(CASE WHEN c1.x=c2.x OR c1.y = c2.y
OR c1.x-c2.x IN (c1.y-c2.y,c2.y-c1.y)
THEN '1'
ELSE '0'
END,',')
,',') cover
FROM c1, c1 c2
WHERE level=49
START WITH c2.id=1
CONNECT BY c1.id = PRIOR c1.id AND c2.id = PRIOR c2.id+1
)
,t(id,cover,result,lvl) AS (
SELECT id,cover,'('||x||','||y||')' AS result,1
FROM cells
WHERE x BETWEEN 1 AND 4
AND y BETWEEN 1 AND 4
AND x <= y
UNION ALL
SELECT c2.id
,LPAD(SUBSTR(c1.cover,1,25)+SUBSTR(c2.cover,1,25),25,'0') ---- 位数太多NUMBER型不支持,所以拆成两截分别相加再拼回来
||LPAD(SUBSTR(c1.cover,26)+SUBSTR(c2.cover,26),24,'0')
,result||'('||c2.x||','||c2.y||')'
,c1.lvl+1
FROM t c1,cells c2
WHERE c1.lvl<4
AND c1.id<c2.id AND SUBSTR(c1.cover,c2.id,1)='0'
)
SELECT result FROM t
WHERE lvl=4
AND INSTR(cover,'0')=0;
RESULT
----------------------------
(2,2)(5,3)(1,6)(4,7)
(3,3)(7,4)(2,6)(6,7) |
|