Pregunta

Estoy escribiendo algunas DB rutinas y estoy usando sentencias preparadas.Mi entorno es PDO con PHP5.

Entiendo declaraciones preparadas principalmente a proporcionar un beneficio en el rendimiento, así como algunos auxiliar de bonos, tales como no tener que manualmente SQL-escapar de los datos de entrada.

Mi pregunta es sobre el rendimiento de la parte.

Tengo dos implementaciones de un getPrice siguiente función que toma un identificador de producto y devuelve su precio.

getPrice_A vuelve a utilizar el mismo objeto PDOStatement a través de las llamadas posteriores dentro de la misma secuencia de comandos de ejecución.Es esto necesario o recomendable?Si es así, ¿hay alguna manera de evitar la duplicación de este código extra a través de cada uno de get*() en cada uno de los modelos?

getPrice_B crea un nuevo objeto PDOStatement en cada llamada.Será el DBMS reconocer esta declaración ya ha sido preparado y aún así ser capaz de saltar de algún trabajo?En otras palabras, hace de esta aplicación correctamente al tomar ventaja de los beneficios de rendimiento de sentencias preparadas?

Después de haber escrito todo esto y leer más, me imagino que getPrice_B es fina y getPrice_A es la prestación de un insignificante beneficio por encima de eso, que puede o no puede ser vale la pena el extra de complicación.

Yo todavía me gusta escuchar para asegurarse de que alguien más informado que aunque.

Suponga que $pdo es válido, conectado objeto PDO en los ejemplos de abajo.

<?php
class Product {
    static function &getPrice_A($id) {
        static $stmt;
        if (!$stmt) {
            $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        }
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }

    static function &getPrice_B($id) {
        $stmt = $pdo->prepare('SELECT price FROM products WHERE id = ?');
        $stmt->execute(array($id));
        return $stmt->fetchColumn(0);
    }
}

// example usage:
$price = Product::getPrice(4982);
echo "Product 4982 costs $price\n";
¿Fue útil?

Solución

Por lo que yo entiendo, declaraciones preparadas para la reutilización de código SQL generado en el plan, si es la misma declaración, en la base de datos va a ver la misma declaración preparada y no tener que hacer el trabajo de averiguar cómo se consulta la base de datos.Yo diría que el trabajo extra de ahorro de la declaración preparada en Product::getPrice_A por lo general no es muy útil, porque se puede ocultar el código en lugar de un problema de rendimiento.Cuando se trata de rendimiento, creo que siempre es mejor centrarse en el código de claridad y, a continuación, el rendimiento cuando se tienen estadísticas que indican un problema.

Yo diría que "sí, el trabajo adicional es innecesaria" (independientemente de si realmente aumenta el rendimiento).Además, yo no soy un gran DB experto, pero la ganancia de rendimiento de sentencias preparadas es algo que he oído de otros, y es en el nivel de base de datos, no en el nivel de código (por lo que si el código es en realidad la invocación de una instrucción parametrizada en el real de la DB, entonces la base de datos puede hacer estas ejecución del plan de almacenamiento en caché...a pesar de que según la base de datos, puede obtener el beneficio, incluso sin la instrucción parametrizada).

De todos modos, si usted está realmente preocupado (y ver) la base de datos de problemas de rendimiento, usted debe buscar en una solución de almacenamiento en caché...de lo que yo recomendaría memcached.Con esta solución, usted puede almacenar en caché los resultados de la consulta y no entra en la base de datos para las cosas que usted acceso con frecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top