2008-12-10 5 views
6

Tengo una función que se ve algo como esto:PHP - ¿Consultar valor único por iteración o buscar todo al inicio y recuperar de la matriz?

//iteration over scales 
foreach ($surveyScales as $scale) 
{ 
    $surveyItems = $scale->findDependentRowset('SurveyItems'); 

    //nested iteration over items in scale 
    foreach ($surveyItems as $item) 
    { 
     //retrieve a single value from a result table and do some stuff 
     //depending on certain params from $item/$scale 
    } 
} 

PREGUNTA: es mejor hacer una consulta db para cada valor único dentro del foreach interno o es mejor para ir a buscar todos los valores de resultado en una matriz y obtener el valor de allí?

Respuesta

18

Una consulta que arroja una docena de datos es casi 12 veces más rápida que 12 consultas que devuelven 1 parte de datos.

Ah, y NUNCA NUNCA JAMÁS ha puesto un SQL dentro de un bucle, siempre lo conducirá en un desastre.

Dependiendo de cómo funcione su aplicación, se puede abrir una nueva conexión para cada consulta, esto es especialmente malo ya que cada servidor de base de datos tiene un límite en el número de conexiones. Luego, tenga en cuenta que esto sucederá para cada usuario, por lo que 50 consultas con 5 usuarios y ya tiene 250 consultas en un momento dado. Pero incluso si todas las consultas comparten solo 1 conexión, estás imponiendo impuestos al servidor de bases de datos X veces más, desacelerándolo para todo lo demás, cada página, porque los usuarios están acaparando el servidor de bases de datos en esta página y todo el mundo tiene que compartir.

He visto una aplicación completa fallar en el pasado debido a este 1 defecto de diseño, simplemente no lo hagas.

+0

Diría que una consulta que recupera x filas es * más de * x veces más rápida que x consultas, cada una recuperando 1 fila. Cuantas más filas, mayor es la diferencia. – Tomalak

+0

si pudieras elaborar un poco sobre la parte del distaster, la respuesta podría ser la aceptada. ¡gracias! – markus

+0

Para profundizar en lo que dice: tocará la base de datos 12 veces por separado. Eso es (al menos) una docena de llamadas a función PHP, posiblemente 12 viajes redondos a través de una red al servidor DB, 12 veces que el servidor tiene que analizar la consulta y construir un plan de ejecución, ... – flussence

1

En definitiva, recupere todo y obtenga de la matriz.

7

Estoy de acuerdo con los demás, ¡y yo fui quien diseñó y codificó la API de relaciones de tabla en Zend Framework que está utilizando!

El findDependentRowset() es útil si ya tiene una referencia a la fila de los padres, y que podría necesidad de recuperar filas relacionadas. Esta función no es eficiente en absoluto, en comparación con una consulta que une ambas tablas. No debe llamar al findDependentRowset() en un bucle, nunca, si el rendimiento es una prioridad en absoluto. En su lugar, escriba una consulta SQL que consista en un JOIN de ambas tablas.

Desafortunadamente, en retrospectiva, el objetivo de Zend para su Framework era la simplicidad del diseño, en lugar del rendimiento.

Si hubiera seguido trabajando en Zend, habría intentado mejorar la interfaz de la Tabla con una forma conveniente de realizar consultas unidas contra objetos Zend_Db_Table relacionados. La solución implementada después de que me fui del proyecto es construir un objeto Select y pasarlo al fetchAll(), lo cual es terriblemente feo.

editar: En respuesta a su comentario, hice mi mejor esfuerzo para crear una solución dado un conjunto de requisitos. Me siento bien por lo que hice. Pero Zend es una empresa de herramientas IDE, así que, naturalmente, su valor está en la conveniencia de la codificación, no en el rendimiento en el tiempo de ejecución. El "desarrollo rápido de aplicaciones" puede significar desarrollar aplicaciones rápidas o desarrollar aplicaciones rápidamente. Para una empresa de herramientas, significa lo último.

+0

estás criticando tu propio trabajo :) ¿No te gusta Zend Framework hoy en día o es solo este tema en particular el que te parece feo? Te pregunto porque parece que sabes mucho sobre ZF y si alguien que lo sabe, no le gusta para nada ... bueno. – markus

+0

RAD nunca significa que la aplicación se ejecuta rápidamente, siempre significa que puede hacer aplicaciones con menos esfuerzo. – TravisO

Cuestiones relacionadas