Ver Mensaje Individual
  #10  
Antiguo 01-03-2008
Avatar de Al González
[Al González] Al González is offline
In .pas since 1991
 
Registrado: may 2003
Posts: 5.604
Reputación: 29
Al González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en brutoAl González Es un diamante en bruto
Smile

¡Hola a todos!

Los saludo con gusto. Revivo este hilo porque me he topado con algo similar. Mi experiencia con planes y selectividad de índices es casi nula en este momento. Pero hoy aprendí algo sobre lo segundo, gracias a este hilo y los siguientes dos enlaces:

http://www.firebirdfaq.org/faq167/

http://vivenciasdiariasmiaspropias.b...imizar-el.html

Empiezo por colocar una versión simplificada del procedimiento actualizador de selectividad de índices. En adelante lo tendré en todas mis bases de datos Firebird:

Código SQL [-]
Create Procedure spActualizarIndices
As
  Declare Variable Nombre VarChar (31);
Begin
  For Select RDB$Index_Name From RDB$Indices Into :Nombre Do
    Execute Statement 'Set Statistics Index ' || :Nombre;
End

Ahora expongo mi caso sin mayores rodeos. Tengo una consulta Select que se ejecuta unas diez veces más rápido con una condición Where que sin ella (aunque la lógica indique que sin la cláusula Where debería ser más rápida). La he reducido a su mínima expresión y le he dado la siguiente forma para ejemplificar:

Código SQL [-]
Select PP.ID, Pr.Codigo From ParteProveedor PP
  Inner Join Proveedor Pr On Pr.ID = PP.IDProveedor
--  Where PP.ID = PP.ID
  Order By PP.FechaModificacion Desc

Cabe mencionar que la tabla ParteProveedor tiene un índice descendente por el campo FechaModificacion.

Comentada la línea del Where, cuando ejecuto la consulta en IB Expert demora alrededor de 4 segundos y en la parte inferior aparece el plan que se utilizó:
Cita:
Plan
PLAN SORT (JOIN (PR NATURAL,PP INDEX (FKPARTEPROVEEDORIDPROVEEDOR)))

Adapted Plan
PLAN SORT (JOIN (PR NATURAL,PP INDEX (FKPARTEPROVEEDORIDPROVEEDOR)))
Si descomento la línea del Where, la consulta tarda apenas una fracción de segundo y aparece otro plan usado:

Cita:
Plan
PLAN JOIN (PP ORDER IXPARTEPROVEEDORFECHAMDS,PR INDEX (PK_PROVEEDOR))

Adapted Plan
PLAN JOIN (PP ORDER IXPARTEPROVEEDORFECHAMDS,PR INDEX (PK_PROVEEDOR))
Es claro que a eso se debe que sea más rápida con la condición Where. En ese caso Firebird decide usar el índice descendente por fecha de modificación (IXPARTEPROVEEDORFECHAMDS) acorde a lo indicado en la cláusula Order By.

Revisando la sintaxis general de una sentencia Select, vi que el plan se especifica como una cláusula más. Así que adapté mi sentencia Select, quedando de esta manera:
Código SQL [-]
Select PP.ID, Pr.Codigo From ParteProveedor PP
  Inner Join Proveedor Pr On Pr.ID = PP.IDProveedor
  Plan Join (PP Order ixParteProveedorFechaMDs, PR Index (pk_Proveedor))
  Order By PP.FechaModificacion Desc

Con esto la consulta se ejecuta en una casi imperceptible fracción de segundo.

Ahora me toca aprender sobre la sintaxis de la cláusula Plan. Le echaré un vistazo a los manuales, pero si alguien puede adelantarse a explicarnos algo, creo que a muchos nos será de gran valía.

Saludos.

Al González.

Última edición por Al González fecha: 01-03-2008 a las 02:57:18.
Responder Con Cita