Domanda

Sto scrivendo alcuni DB routine e sto usando le istruzioni preparate.Il mio ambiente è DOP con PHP5.

Capisco le istruzioni preparate principalmente di fornire un vantaggio in termini di prestazioni, così come ausiliari di bonus, come ad esempio non dover manualmente SQL-fuga di dati di input.

La mia domanda è la parte esecutiva.

Ho due implementazioni di un getPrice la funzione qui sotto che prende un id di prodotto e restituisce il suo prezzo.

getPrice_A riutilizza la stessa PDOStatement oggetto attraverso le successive chiamate all'interno dello stesso script di esecuzione.È necessario o consigliato?Se è così, c'è un modo per evitare la duplicazione di questo codice aggiuntivo su ogni singolo get*() in ogni singolo modello?

getPrice_B crea un nuovo PDOStatement oggetto su ogni chiamata.Sarà il DBMS riconoscere questa istruzione è già stato preparato e di essere ancora in grado di saltare qualche lavoro?In altre parole, questa implementazione adeguatamente sfruttare i vantaggi di prestazioni di istruzioni preparate?

Dopo aver scritto tutto questo e leggerlo, immagino getPrice_B è fine e getPrice_A è fornire un trascurabile vantaggio in cima a quello, che può o non può essere vale la pena di ulteriore complicazione.

Mi piacerebbe comunque sentire di sicuro da qualcuno più informato però.

Si supponga che $pdo è un valido, collegato DOP oggetto negli esempi riportati di seguito.

<?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";
È stato utile?

Soluzione

Da quello che ho capito, le istruzioni preparate in grado di riutilizzare il codice SQL generato piano se è la stessa dichiarazione, in modo che il database di vedere la stessa dichiarazione preparata e non fare il lavoro per capire come eseguire una query sul database.Direi che il lavoro supplementare di risparmio di dichiarazione preparata in Product::getPrice_A non è in genere molto utile, più che altro perchè si può oscurare il codice piuttosto che un problema di prestazioni.Quando ha a che fare con le prestazioni, sento che è sempre meglio concentrarsi su codice di chiarezza e quindi le prestazioni quando si hanno reali statistiche che indicano un problema.

Mi verrebbe da dire "sì, il lavoro supplementare è necessaria" (indipendentemente se si aumenta molto le prestazioni).Inoltre, io non sono un grande DB esperto, ma il guadagno di prestazioni di istruzioni preparate è qualcosa che ho sentito da altri, ed è a livello di database, non a livello di codice (quindi, se il codice è effettivamente richiamare la parametrizzazione di una dichiarazione sull'effettiva DB, quindi il DB può fare questi piano di esecuzione di cache...anche se, a seconda del database, si può ottenere il beneficio anche senza l'istruzione con parametri).

Comunque, se siete veramente preoccupati (e vedere) database problemi di prestazioni, si dovrebbe guardare in una soluzione di caching...di cui mi raccomando memcached.Con tale soluzione, è possibile memorizzare nella cache i risultati della query e non ha colpito anche il database per le cose che si accede di frequente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top