
- El análisis sintáctico de la sentencia SQL (ver artículo sobre las fases del procesamiento de una sentencia SQL).
- El plan de ejecución.
- La lista de objetos de la base de datos que son referenciados por la sentencia.
Si dos usuarios ejecutan la misma sentencia SQL o PL/SQL, entonces ambos utilizaran el mismo cursor. Los beneficios de los cursores compartidos son evidentes:
- Reducción del tiempo de parsing o análisis sintáctico de la sentencia SQL o PLSQL.
- Las necesidades de memoria se ajustan dinámicamente y el uso de la misma puede mejorar de forma importante.
Los cursores sólo pueden ser compartidos por sentencias SQL que tienen las siguientes características:
- Se trata de sentencias SQL idénticas.
- El texto de las sentencias SQL debe ser exactamente el mismo, incluyendo mayúsculas, espacios, tabuladores, retornos de carro y comentarios.
- Los objetos de la base de datos Oracle a los que hace referencia la sentencia SQL deben ser también idénticos. Por ejemplo, dos tablas pueden recibir el mismo nombre pero pertenecer a diferentes usuarios o esquemas y, por tanto, tratarse a nivel de base de datos de tablas diferentes.
- Los tipos de las variables usadas en la sentencia SQL deben ser iguales (ver tipos de datos en PL/SQL). No es necesario que los nombres de las variables sean idénticos, es decir, sentencias SQL como SELECT * FROM clientes WHERE cliente_id = :c y SELECT * FROM clientes WHERE cliente_id = :d pueden ser sentencias idénticas ya que las variables c: y d: son renombradas internamente (la primera variable de una sentencia SQL es siempre renombrada como :b1, la segunda como :b2 y así sucesivamente).
Con respecto a este punto debo mencionar que la mayoría de las herramientas Oracle, tales como PL/SQL, precompiladores y Oracle Developer, realizan un preprocesado de las sentencias SQL para hacerlas tan idénticas como sea posible mediante la eliminación de comentarios y de espacios innecesarios, así como convirtiendo mayúsculas y minúsculas cuando esto es posible. SQL*Plus es la excepción y envía las sentencias SQL tal y como son escritas por el usuario.
Por esta razón es muy importante que, cuando escribamos código SQL y PLSQL, creemos código lo más genérico posible mediante:
- La utilización de procedimientos, funciones y paquetes PL/SQL almacenados.
- El uso de triggers PL/SQL.
- Hacer llamadas a triggers y procedimientos almacenados en la base de datos cuando utilicemos Oracle Developer.
- Escribir librerías de rutinas y procedimientos.
También es crucial que sigamos unos estándares a la hora de escribir código SQL:
- Seguir unos estándares para todo tipo de sentencias, incluyendo las sentencias en código PLSQL.
- Desarrollar normas en cuanto al uso de mayúsculas y minúsculas.
- Desarrollar normas en cuanto a la utilización de espacios, tabuladores y retornos de carro.
- Seguir unos estándares para los comentarios. Preferiblemente los comentarios deben mantenerse fuera de las sentencias SQL o PL/SQL.
- Utilizar los mismos nombres a la hora de referirse a objetos de la base de datos idénticos. Por ejemplo, aunque incomodo puede resultar interesante preceder a los nombres de las tablas con el nombre del esquema (o usuario) al que pertenecen.
3 comentarios:
Muy bueno el artículo.
No sabía lo de espacios, tabuladores, etc....
Si tenéis querys con problemas de rendimiento las podéis enviar aquí:
www.sendyourquery.com
De momento es gratis.
Le envie un query y aun no tengo respuesta mis saludos..correo carlosf33@gmail.com
Hola Carlos,
Los de sendyourquery no tienen nada que ver con este blog. De todas formas los problemas de rendimiento son difícilmente detectables sin tener acceso a la base de datos Oracle donde se están produciendo. Analizando simplemente la query es muy difícil identificar cual es el problema.
Publicar un comentario