Ver Mensaje Individual
  #2 (permalink)  
Antiguo 25/02/2012, 20:18
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Queries que generan sobrecarga

Bueno, la segunda consulta tiene una condición muy usada, pero extremadamente ineficiente.
Cuando usas LIKE, se busca por similitud; se busca un conjunto de letras precedido o seguido por cualquier otra cosa que contenga, o nada. Para eso es que se usa el comodín (%).
Pero cuando pones
Código SQL:
Ver original
  1. campo LIKE '%textobuscado%'
esa condición implica que busque lo que comience y termine con cualquier cosa... En los hechos hace un table scanning, que significa que leerá toda la tabla. Completa. Todos los registros, revisando uno por uno, porque no puede discriminar nada.
Es la peor situación de una consulta. Como dije, es una forma muy usada, pero no por eso es mejor. Todo lo contrario.
Es la peor lectura posible.
Antes de usar eso es preferible hacer un
Código SQL:
Ver original
  1. (campo LIKE 'textobuscado%' OR campo LIKE '%textobuscado'
ya que a pesar de ser semánticamente similares, tienden a ser más rápidos, ya que descarta todo lo que no comience o termine con lo buscado, lo que será la mayoría. Ten en cuenta que la gente suele escribir el comienzo del texto buscado, y no la mitad del texto (Si buscas Ciudad del Cabo, es muy probable que escribas "Ciudad del" o "del Cabo" y no "dad del C")
Y para el caso de textos intermedios, incluso, es preferible usar MATCH(...) AGAINST(...), e índices FULLTEXT. Son más eficientes.

Por otro lado, y respecto a NATURAL JOIN y LEFT OUTER JOIN; es mejor referirte al manual oficial del tema:
Cita:
La sintaxis { OJ ... LEFT OUTER JOIN ...} ...existe sólo por compatibilidad con ODBC.
Cita:
El NATURAL [LEFT] JOIN de dos tablas se define semánticamente equivalente a un INNER JOIN o LEFT JOIN con una cláusula USING que nombra todas las columnas que existen en ambas tablas.
En otras palabras, aunque soporta la sintaxis de ambas, en realidad internamente operan igual que usar INNER JOIN y LEFT JOIN, sin ninguna ventaja adicional.
En el caso de LEFT JOIN, lo que debes recordar es que la tabla izquierda debe ser siempre la tabla primaria de los datos que buscas, y no la tabla secundaria.
Esto significa que si lo que quieres es, por ejemplo, las exportaciones discriminadas por empresa, la tabla izquierda debe tener la lista de empresas y la derecha la lista de productos exportados. ¿Se entiende? Hacerlo al revés haría que el resultado del LEFT JOIN fuese igual al de un INNER JOIN.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)