Ir al contenido


Foto

Mostrar el Plan de una Consulta con componentes DBExpress


  • Por favor identifícate para responder
7 respuestas en este tema

#1 lbuelvas

lbuelvas

    Member

  • Miembros
  • PipPip
  • 20 mensajes
  • LocationColombia

Escrito 25 octubre 2009 - 07:32

Hola foro,

Tomé la decision de migrar mis aplicaciones (y mi Framework) desde Delphi 6 a Delphi 2010, estaba utilizando los componentes IBX porque trabaja excluisvamente con Firebird, sin embargo, quiero estar abierto a posibles trabajos con otros motores de bases de datos.  Otra razon es es que los IBX van a presentar en el futuro incompatibilidades con Firebird.

La decisión fue pasarme a los DBExpress (DBX) porque ya hay soporte nativo a Firebird y los proveedores de componentes se apegan a esta plataforma, no es mas el motivo de escoger esta opcion sobre las demas.

Muchos problemas he tenido porque los IBX realmente están muy bien diseñados, entre las dificultades (o desconozco como hacerlo) es que no se como conocer el Plan de una Consulta.

En IBX los TIBDataset tienen la propiedad Plan, en los TSQLDataset o TClientDataset no veo la forma para ver el plan de la consulta.

Alguien puede darme una ayuda ?

Gracias

Luis F. Buelvas T.
  • 0

#2 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 octubre 2009 - 08:22

Primero que todo, Bienvenido al foro amigo.

No he trabajado con los IBX pero si con DBExprees y Firebird, ¿Podrías ilustrarme un poco en que consiste el "Plan de consulta", que tipo de propiedad es?, con esa información podriamos buscar el equivalente (si existe) en DbExpress.

Saludos
  • 0

#3 lbuelvas

lbuelvas

    Member

  • Miembros
  • PipPip
  • 20 mensajes
  • LocationColombia

Escrito 26 octubre 2009 - 09:03

Hola,

El plan de una consulta es el mecanismo que los motores de base de datos utilizan para obtener los registros de una consulta.  El motor indaga de acuerdo a la consulta (las tablas que utiliza, las uniones, las condiciones (where)) y de acuerdo a los indices que tienen las tablas (llaves primarias pues toda llave primaria en el fondo es un indice, llaves foraneas y otros indices) cual es la mejor forma de encontrar la informacion.

Este es un ejemplo de una consulta, plan contiene el plan que utilizó el motor para buscar los registros, como puede ver aparece con los nombres internos que dio el motor, plan adaptado es una modificacion que hice para ver los nombres de los indices para el usuario.

select  departamento.*
from    departamento
order by departamento.nombre_departamento

Plan de la Consulta:
PLAN (DEPARTAMENTO ORDER RDB$PRIMARY5)

Plan Adaptado:
PLAN (DEPARTAMENTO ORDER PK_DEPARTAMENTO)

El plan indica que la forma de recorrer los registros es basando en la llave primaria.

Pero si hago una consulta

select    departamento.*
from      departamento
order by departamento.nombre_departamento desc

Plan de la Consulta:
PLAN SORT ((DEPARTAMENTO NATURAL))

Plan Adaptado:
PLAN SORT ((DEPARTAMENTO NATURAL))

Donde NATURAL significa que la tabla debe recorrerse de principio a fin, en una consulta que involucre muchos registros esto puede significar tiempos de respuesta lentos en una aplicacion.  De alli que uno adicione indices a la base de datos para que el motor de bases de datos tenga herramientas para hacer las consultas mas eficientes.

Resulta que en los componentes IBX existe la propiedad Plan que es una cadena de caracteres que contiene el plan de la consulta y en mis aplicaciones hago uso de esa caracteristica para facilitar la revision del rendimiento. 

En los DBExpress existe alguna forma o una propiedad que me brinde esa informacion ?
  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 octubre 2009 - 09:30

Entendido amigo, DbExprees cuenta con un poderoso arsenal para hacer lo mismo,  como sabes dbExprees es unidieccional, para poder interactuar bidireccionalmente con Dataset de DbExpress, debes utilizar los TClientDatasets enganchados de  TDatsetProviders, estos últimos tienen varias opciones de configuración te describo algunas de las mas importantes:

PoIncFieldsPorps: Te pasa la configuración de los campos pesristentes del dataset amarrado al proveedor directamente al ClientDatset.
PoPropogateChanges : Te envia al ClientDatset los cambios obtenidos mediante la reslución de actualización.
PoAllowCommandTex: Te permite cambiar la consulta en el ClientDataset.

Dispones de la propiedad UpdateMode: Para escoger el modo de actualización.

Pero quizá tu pregunta la contesta lo siguiente, en el Dataset de dbExpress que utilices debes configurar los campos persistentes, estos a a su vez tinen la propiedad ProviderFlags que es supremamente importante para trabajar con esta tecnología, allí escoges el campo que es la clave primaria y le asignas  True a pfInKey; a los campos que pertenecen a otras tablas y que son solo informativos(y que no se van a actualizar) debes asignarle False a pfInWhere y pfInUpdate, a los campos Blob solo True a pfInUpdate.

Igual si es una consulta muy complicada dispones del evento OnGetTableName del proovedor para informarle cual es la tabla que deseas actualizar.

Cualquier duda que vaya surgiendo en el camino no dudes en preguntar.

Saludos
  • 0

#5 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 octubre 2009 - 09:45

Donde NATURAL significa que la tabla debe recorrerse de principio a fin, en una consulta que involucre muchos registros esto puede significar tiempos de respuesta lentos en una aplicacion.  De alli que uno adicione indices a la base de datos para que el motor de bases de datos tenga herramientas para hacer las consultas mas eficientes.

En los DBExpress existe alguna forma o una propiedad que me brinde esa informacion ?


Para controlar el tamaño de los paquetes en el TClientDataset  cuentas con las propiedades FechtOnDemand
que debes ponerla a true (si quieres controlarlo) y asignar un valor (los registros que quieres que vengan en cada llamada) a PacketRecords.

Saludos
  • 0

#6 lbuelvas

lbuelvas

    Member

  • Miembros
  • PipPip
  • 20 mensajes
  • LocationColombia

Escrito 26 octubre 2009 - 12:36

Gracias por la informacion me has dado, son elementos importantes para el trabajo que estoy haciendo, especialmente las propiedades principales de los TClientDataset.

Sin embargo, creo que no me he hecho entener por eso voy a ampliar mi explicacion.  El sistema cuenta con un pequeño modulo para hacer consultas directamente a la base de datos (no se permiten inserciones, ni borrados, ni actualizaciones).  El usuario cuando va a hacer la consulta el sistema previamente la prepara (TIBDataset.Prepare) y se revisa el plan que el motor va a utilizar (TIBDataset.Plan), si en el plan de la consulta aparece la palabra NATURAL el sistema no la deja hacer a no ser que sea el administrador del sistema.

Esto es para evitar que usuarios se pongan a hacer consultas que provoquen una caida del servidor.

De nuevo gracias por prestar atencion al presente hilo.
  • 0

#7 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 26 octubre 2009 - 03:25

Gracias por la informacion me has dado, son elementos importantes para el trabajo que estoy haciendo, especialmente las propiedades principales de los TClientDataset.

Sin embargo, creo que no me he hecho entener por eso voy a ampliar mi explicacion.  El sistema cuenta con un pequeño modulo para hacer consultas directamente a la base de datos (no se permiten inserciones, ni borrados, ni actualizaciones).  El usuario cuando va a hacer la consulta el sistema previamente la prepara (TIBDataset.Prepare) y se revisa el plan que el motor va a utilizar (TIBDataset.Plan), si en el plan de la consulta aparece la palabra NATURAL el sistema no la deja hacer a no ser que sea el administrador del sistema.

Esto es para evitar que usuarios se pongan a hacer consultas que provoquen una caida del servidor.

De nuevo gracias por prestar atencion al presente hilo.


Para eso DbExpress cuenta con TSLQServerMethod con el cual puedes crear en el lado servidor procedimientos o funciones que pueden devolver un conjunto de datos y que pueden ser llamados desde cualquier cliente, ya la implementación en sí depende de tu gusto, podrías hacer que solo usuarios con cierto rango ejecutaran cierto tipo de métodos.



Aquí puedes encontrar mas información y ejemplos.

Saludos
  • 0

#8 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 03 noviembre 2009 - 09:33

Saludos.

En lo particular utilice DbExpress con Firebird versión = Interbase 6 y nunca pude conseguir el Plan.

En ese aspecto DbExpress es bastante deficiente, en el mejor de los casos tiene un componente de Monitoreo que no es tan bueno como ellos explican en su ayuda; yo sin importar el componente utilizo a IbExpert quien explica el Plan a utilizar.

En D2010 es que DbExpress tiene soporte para FB aunque no con sus nuevas funciones y características, mis aplicaciones van orientadas a utilizar a FB por eso utilizo componentes que acceden directamente a FB aunque sacrifique esa parte de accesibilidad.
  • 0




IP.Board spam blocked by CleanTalk.