Nasıl hazırlanmış tablolar çalışır?

1 Cevap php

Bazı DB rutinleri yazıyorum ve ben hazırlanmış deyimleri kullanıyorum. Benim çevre PHP5 ile PDO olduğunu.

Ben öncelikle böyle elle SQL kaçış veri girişi zorunda değil gibi bazı yardımcı ikramiye bir performans yararı sağlamak, yanı sıra hazır deyimleri anlamak.

Benim soru performans parçası hakkında.

Bir ürün kimliği alır ve fiyatını döndüren altında ben bir getPrice fonksiyonun iki uygulamaları var.

getPrice_A aynı komut dosyası içinde sonraki çağrıları karşısında aynı PDOStatement nesnesi yeniden kullanır. Bu gerekli ya da önerilir mi? Eğer öyleyse, her modelde) (her get * genelinde bu fazladan kod çoğaltma önlemek için herhangi bir yolu var mı?

getPrice_B her çağrı üzerine yeni bir PDOStatement nesnesi oluşturur. DBMS bu deyimi şimdiden hazırlanmış tanımak ve hala bazı iş atlamak mümkün olacak? Diğer bir deyişle, bu uygulama düzgün hazırlanmış tabloların performans avantajlarından sürer?

Bütün bunları yazılı ve üzerinde okuduktan sonra, ben getPrice_B ince ve getPrice_A veya ekstra komplikasyon değerinde olmayabilir ki, bunun üstüne bir ihmal fayda sağladığı düşünün.

Ama hala daha bilgili birinden kesin duymak istiyorum.

Bu $pdo, aşağıdaki örneklerde, geçerli ve bağlı PDO amacı varsayalım.

<?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";

1 Cevap

Kimden ne anlıyorum, aynı deyim ise hazırlanan tablolar oluşturulan SQL planı yeniden, bu nedenle veritabanı aynı hazırlanmış deyimi göreceksiniz ve veritabanını sorgulamak için nasıl anlamaya işi yapmak zorunda değil. Ben oldukça bir performans sorunu daha kod belirsiz olabilir çünkü hazırlanmış deyimi tasarruf ekstra çalışma Product::getPrice_A genellikle çok yararlı, fazla değildir söyleyebilirim. Performansı ile uğraşırken, ben bunu bir sorun olduğunu gösterebilir gerçek istatistikler varken kod açıklık ve sonra performansı odaklanmak her zaman iyi hissediyorum.

Ben (ne olursa olsun gerçekten performansını artırır eğer) "evet, ekstra çalışma gereksiz" derdi. Kodu aslında bir parametreli açıklama çağırarak Ayrıca, eğer ben çok büyük bir DB uzman değilim, ama hazırlanan tabloların performans kazancı ben başkalarından duydum bir şeydir, ve veritabanı seviyesinde değil, kod düzeyde olduğunu (yani Gerçek DB, daha sonra DB bu yürütme planı önbelleğe alma yapabilirim ... veritabanına bağlı olsa da, hatta parametreli deyimi olmadan parası alabilirsiniz).

Eğer gerçekten endişeli (ve görme) veritabanı performans sorunları varsa neyse, ben son derece tavsiye ederim hangi ... bir önbelleğe alma çözüm içine bakmalı memcached. Böyle bir çözüm ile, sorgu sonuçlarını önbelleğe ve hatta sıkça eriştiğiniz şeyler için veritabanı vurmak değil.