Unite al grupo

Grupos de Google
Suscribirte a webandbeer
Correo electrónico:
Consultar este grupo

domingo, 29 de junio de 2008

Oracle/PHP for starters: Introducción y asteriscos

Antes que nada, una pequeña presentación. Mi nombre es Andrés, actualmente trabajo en Intraway, y Cesar me pidió que escribiera algunas cositas sobre Oracle.

Debo decir, para empezar que no soy ningún especialista en el tema, y que seguramente cualquier otro compañero podría decirles muchas más cosas sobre este enorme y complejo DBMS. Por lo tanto, me pareció que una buena aproximación para escribir al respecto podría ser comentar las cosas más importantes que fui aprendiendo en el último año y medio que vengo trabajando con Oracle (particularmente Oracle 10g). No son necesariamente cuestiones específicas de Oracle, sino que yo las aprendí trabajando sobre ese entorno y frecuentemente son cosas que los desarrolladores web no tomamos en cuenta. Así doy comienzo a esta pequeña serie de posts llamada "Oracle/PHP for starters".

Antes que nada, un pequeño comentario sobre cómo trabjar con Oracle desde PHP (que es lo que yo uso).  Actualmente, PHP incluye dos librerías para trabajar con Oracle (en realidad hay más, pero estas son las más importantes): Oci8 y PDO. La primera es una librería en C específica para conectarse a Oracle y la segunda son los PHP Data Objects que sirven de interfaz para conectarse a múltiples sistemas de bases de datos. Si bien yo diriamente trabajo con Oci8, al día de hoy me parece que lo más adecuado es incorporar PDO para obtener una aproximación uniforme a múltiples DBMS.

Adicionalmente, es muy recomendable este PDF de Oracle, llamado "The Underground PHP and Oracle Manual", que se actualiza regularmente y explica todo lo que uno debería saber sobre cómo trabajar con Oracle desde PHP. De hecho, abunda más en las distintas formas de conectarse a Oracle desde PHP con Oci8, PDO, ADOdb, PEAR DB, PEAR MDB2, y Zend Core for Oracle.

Voy a empezar con un tema muy (quizás demasiado) sencillo, pero que a la hora de la verdad, hace la diferencia en términos de rendimiento y seguridad.

Olvidate de los asteriscos

Empecemos por el más sencillo de todos. Evitar a toda costa los asteriscos (*) en las consultas. Este detalle, que para muchos será absolutamente básico (casi me avergüenza tener que mencionarlo), no lo es tanto para la mayoría de los desarrolladores. ¿Cuántas sencillas aplicaciones de ABM en PHP con MySQL hemos visto que hacen queries del estilo de esta?:

SELECT * FROM tabla;

Pero, ¿por qué debemos evitar este tipo de prácticas?. Muy sencillo: con el * le estamos diciendo al DBMS que traiga todos los campos de la/s tabla/s seleccionadas, con lo cual el motor pierde una cantidad preciosa de tiempo en el plan de ejecusión buscando la estructura de cada tabla para poder devolvérnosla. Ahora bien, si nosotros ya conocemos la estructura de la tabla, ¿por qué no se la adelantamos al motor para que se ahorre ese paso?. Es un detalle básico, que puede demorarnos unos segundos extra al momento de armar la query y nos puede llegar a ahorrar mucho tiempo después en la performance de la query. Solamente basta reescribir la query para dejar algo como esto:

SELECT campo1, campo2, campo3 FROM tabla;

Adicionalmente, deberíamos agregar que el orden de los campos incide en la performance de la query, por lo que es importante siempre procurar escribirlos en el orden en que se encuentran en la tabla. De la misma forma, si la consulta incluye joins con otras tablas, los campos deberán ser solicitados en el orden en que se consultan las tablas.

La misma idea sería aplicable al caso de los COUNT(*). ¡He llegado a encontrarme casos de gente que hace un 'SELECT *' y luego un count() en PHP para saber cuántos registros hay en una tabla!. Más allá de esos casos extremos, sería bueno reemplazar queries como la siguiente:

SELECT COUNT(*) FROM tabla;

Por alguna de estas otras:

SELECT COUNT(tabla_id) AS qty FROM tabla;

SELECT COUNT(1) AS qty FROM tabla;

1 comentario:

Pablo Morales dijo...

Muy bueno.
Justo ahora que voy a tener que trabajar con Oracle XE :)

Espero los proximos articulos.
Suerte!