我写一些数据库的程序和我使用准备好的发言。我的环境是一项旨在与PHP5.

我明白准备好的发言主要是提供性能的益处,以及一些辅助的奖金,如不必手动SQL-逃输入数据。

我的问题是有关业绩的一部分。

我有两个实现getPrice功能低于需要的产品标识,并返回其价格。

getPrice_A重复使用相同的PDOStatement对象在随后的电话在相同的脚本中执行。这是必要的或建议?如果是这样,是否有任何方法,以避免重复这一额外的代码,在每一个单一的获得*()在每个单一的模式?

getPrice_B创建一个新的PDOStatement上的对象每次呼叫。将DBMS认识到这项声明已经准备好了并且仍然能够跳过一些工作?换句话说,这是否实现适当地利用性能的好处准备的声明?

具有编写所有这一阅读它,我想getPrice_B是现和getPrice_A是提供一个可以忽略不计获益的最重要的是,这可能或不可能是值得额外的并发症。

我还是喜欢听到肯定从别人的更多知识。

假设 $pdo 是一个有效、连接公设辩护对象的实例如下。

<?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";
有帮助吗?

解决方案

从什么我明白了,准备好的发言将重复利用的产生的SQL计划,如果是相同的声明,因此该数据库将看到同样的语句,并没有做的工作,找出如何查询的数据库。我要说的额外工作的节准备的发言 Product::getPrice_A 通常不是非常有益的,因为它可能会掩盖代码,而不是一个问题的性能。当处理表现,我觉得它始终最好把重点放在码清楚然后能当你有真实的统计数据,表明一个问题。

我会说:"是的,额外的工作是不必要的"(无论它是否真正地提高了性能)。还有,我不是一个非常大的DB专家,但能获得的准备好的发言是我听到别人,也是在数据库的水平,不代码的水平(如果代码实际上是调用了参数化的声明实际的数据库,然后该数据库可以做这些执行计划的缓存...虽然根据不同的数据库,则可以获得的利益,即使没有参数化的声明).

不管怎么说,如果你真的担心(并见)数据库的业绩问题,应寻找到一个缓存解决方案...我会强烈建议 缓存.这样一个解决方案,可以缓你的查询结果,甚至没打数据库的事情,你的访问频繁。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top