Tienen las siguientes tablas (Oracle 10g):Cómo otimize de selección de varias tablas con millones de filas
catalog (
id NUMBER PRIMARY KEY,
name VARCHAR2(255),
owner NUMBER,
root NUMBER REFERENCES catalog(id)
...
)
university (
id NUMBER PRIMARY KEY,
...
)
securitygroup (
id NUMBER PRIMARY KEY
...
)
catalog_securitygroup (
catalog REFERENCES catalog(id),
securitygroup REFERENCES securitygroup(id)
)
catalog_university (
catalog REFERENCES catalog(id),
university REFERENCES university(id)
)
catálogo: 500 000 filas, catalog_university: 500 000, catalog_securitygroup: 1 500 000.
Necesito seleccionar las 50 filas del catálogo con la raíz especificada ordenada por nombre para la universidad actual y el grupo de seguridad actual. Hay una consulta:
SELECT ccc.* FROM (
SELECT cc.*, ROWNUM AS n FROM (
SELECT c.id, c.name, c.owner
FROM catalog c, catalog_securitygroup cs, catalog_university cu
WHERE c.root = 100
AND cs.catalog = c.id
AND cs.securitygroup = 200
AND cu.catalog = c.id
AND cu.university = 300
ORDER BY name
) cc
) ccc WHERE ccc.n > 0 AND ccc.n <= 50;
Dónde 100 - algunos de catálogo, 200 - algunos SecurityGroup, 300 - alguna universidad. Esta consulta devuelve 50 filas de ~ 170 000 en 3 minutos.
Pero la próxima consulta de Retorno Este filas de 2 segundos:
SELECT ccc.* FROM (
SELECT cc.*, ROWNUM AS n FROM (
SELECT c.id, c.name, c.owner
FROM catalog c
WHERE c.root = 100
ORDER BY name
) cc
) ccc WHERE ccc.n > 0 AND ccc.n <= 50;
construyo siguientes índices: (catalog.id, catalog.name, catalog.owner), (catalog_securitygroup.catalog, catalog_securitygroup.index), (catalog_university.catalog, catalog_university.university).
Plan para la primera consulta (utilizando PLSQL Developer): Plan de
http://habreffect.ru/66c/f25faa5f8/plan2.jpg
para la segunda consulta:
http://habreffect.ru/f91/86e780cc7/plan1.jpg
¿Cuáles son las formas de optimizar la consulta que tengo?
+1 por completness, ¿puede agregar EXPLAIN PLANS para ambas consultas? – Unreason
Como escribí anteriormente, necesito seleccionar 50 (0-50 o 50-100 o 100-150 etc.) filas del catálogo con la raíz especificada ordenada por nombre para la universidad actual y el grupo de seguridad actual. Cada catálogo puede ser accesible para ciertas universidades y grupos de seguridad. Y cada catálogo muestra 50 resultados por página. –
LMFAO, @ Antón, ¿se supone que ese último comentario es un PLAN DE EXPLICACIÓN? Creo que sí ... no es una explicación de un plan, es el "mapa de ruta" de los optimizadores sobre cómo ejecutar la consulta. ¿Qué herramienta está usando y podemos decirle cómo obtener el plan? –