2010-02-09 13 views
14

Acabo de configurar FirePHP en Zend y estoy notando una gran cantidad de consultas de DESCRIBE. Algunas páginas tienen 50 o más consultas idénticas, todas en la misma tabla. p.ej.Muchas consultas DESCRIBE en Zend Framework

0.00198  connect  NULL 
0.00449 DESCRIBE `nodes` NULL 
0.00041 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111))) NULL 
0.0037 DESCRIBE `nodes` NULL 
0.00155 SELECT `nodes`.* FROM `nodes` WHERE (((`nodes`.`id` = 111))) NULL 
0.00059 SELECT `nodes`.* FROM `nodes` WHERE (parent_id = '111') ORDER BY `order` ASC, `id` ASC NULL 
0.00366 DESCRIBE `nodes` NULL 
0.0054 DESCRIBE `nodes` NULL 
0.0049 DESCRIBE `nodes` NULL 
0.00519 DESCRIBE `nodes` NULL 
0.00492 DESCRIBE `nodes` NULL 
0.00691 DESCRIBE `nodes` NULL 
0.00741 DESCRIBE `nodes` NULL 
0.0048 DESCRIBE `nodes` NULL 
0.00556 DESCRIBE `nodes` NULL 
0.00516 DESCRIBE `nodes` NULL 
0.00487 DESCRIBE `nodes` NULL

... y continúa.

¿Son todas esas consultas DESCRIBE generadas por el marco (estoy usando Zend_DbTable)? ¿Son todos necesarios? ¿Debería preocuparme por ellos o es probable que no afecten el rendimiento?

Respuesta

13

Esas consultas se ejecutan por Zend_Db_Table para detectar el esquema de las tablas. Puede pedirle a Zend_Db_Table que guarde en caché los resultados usando Zend_Cache para evitar llamadas constantes, pero tenga esto en cuenta si cambia el esquema.

Puede hacerlo utilizando:

Zend_Db_Table_Abstract::setDefaultMetadataCache($cache); 
+0

Estoy interesado en esto. ¿Conoces un buen recurso en profundidad sobre cómo configurar la porción de $ caché? – Sonny

+0

Consulte el manual de Zend Framework: http://framework.zend.com/manual/en/zend.db.table.html#zend.db.table.metadata.caching – Johnco

+0

He leído eso. Estoy buscando algo con sugerencias sobre los pros/contras de diferentes configuraciones, como qué tipo de caché usar, qué directorio usar al usar el tipo 'archivo', etc. – Sonny

3

Zend_Db_Adapter_Abstract::describeTable() hace estas consultas para obtener los metadatos de sus tablas al usar Zend_Db_Table Esto se utiliza, por ejemplo, cuando no especifica una clave principal explícitamente. Puede habilitar el caché de MetaData o simplemente usar Zend_Db en lugar de Zend_Db_Table.

I piensa Aunque no debería tener esta descripción de muchas consultas. Una vez que se configura una instancia Zend_Db_Table, almacenará los metadatos después de la primera consulta para la solicitud restante. Intenta usar Zend_Debugger o Xdebug para descubrir qué está causando esto.

Ver

+0

Esto se realiza cada vez que se crea nueva instancia de Zend_Db_Table. Es por eso que sucedió tantas veces. –

+0

@tomas sí, y es por eso que me desconcierta porque no debería haber ninguna razón para crear la instancia varias veces en una sola solicitud. – Gordon

+0

Estaba creando una instancia de un dbTable para cada instancia del modelo. Lo he solucionado guardando en caché la instancia de dbTable como una propiedad estática en el modelo. – Tamlyn

3

que utiliza un patrón Singleton para almacenar los casos Zend_DbTable en una matriz estática en mi clase del modelo base. Esto reduce las consultas de DB a una por solicitud que es lo suficientemente buena para mí y también reduce la cantidad de objetos que necesitan ser instanciados.

Por ejemplo:

protected $_dbTable; 
protected $_table; //override the database table name in subclass 

private static $_dbTableCache = array(); 

public function __construct() 
{ 
    $this->_dbTable = $this->getDbTableInstance($this->_table); 
} 

protected function getDbTableInstance($tableName) { 
    if (self::$_dbTableCache[$tableName] === null) { 
     self::$_dbTableCache[$tableName] = new Zend_Db_Table($tableName); 
    } 
    return self::$_dbTableCache[$tableName]; 
} 
+0

Estoy haciendo algo similar, usando el Zend_Registry. – Sonny

+1

El registro es una mejor forma (código más corto), creo ... :) –

+0

¿Por qué tiene varias instancias en absoluto? Quiero decir, para varias tablas sí, pero no necesitas varias instancias de la misma tabla, ¿verdad? – Gordon