1

最近、クエリをより高速に実行する方法があるかどうかを尋ねました(トピック:Zendでのpostgresqlクエリが遅い)。「describe」クエリを削除した結果、20〜30%のブーストが発生しました。しかし、それでも私のクエリは遅すぎます。

class Application_Model_DbTable_Images extends Zend_Db_Table_Abstract
{
    protected $_name = 'images';

    public function getImage($id)
    {
        $row = $this->fetchRow("id = $id");
        return $row;
    }
}

アプリケーションのプロファイルを作成したところ、1回のgetImage()呼び出しが約300ミリ秒続くことに気付きました。しかし、2回呼び出すと、2回目の呼び出しは約15ミリ秒続きます。すべてのクエリをこれほど速く実行するにはどうすればよいですか?

また、describeクエリがもうないことを100%確信しています-データベースクエリログを確認しましたが、すべてのクエリは完璧に見えます。

4

3 に答える 3

0

データベース自体がパフォーマンスに影響を与える可能性があるのと同様に、呼び出しコードもパフォーマンスに影響を与える可能性があります。ZF でクエリを作成するさまざまな方法を比較して、違いがあるかどうかを確認することができます。

現在:

class Application_Model_DbTable_Images extends Zend_Db_Table_Abstract
{
    protected $_name = 'images';

    public function getImage($id)
    {
        $row = $this->fetchRow("id = $id");
        return $row;
    }
}

試す:

class Application_Model_DbTable_Images extends Zend_Db_Table_Abstract
{
    protected $_name = 'images';

    public function getImage($id)
    {
        $select = $this->select()->where('id = ?', $id);//try using the select(), ZF will anyway
        $row = $this->fetchRow($select);
        return $row;
    }
}

また:

class Application_Model_DbTable_Images extends Zend_Db_Table_Abstract { protected $_name = 'images';

public function getImage($id)
{
    $select = $this->select()->where('id = ?', $id);
    $row = $this->fetchAll($select);//maybe a different fetch will have an effect
    return $row;
}

}

ここでは、クエリを作成するさまざまな方法の例をいくつか示します (他にも多数あります)。これらはパフォーマンスに役立つ場合とそうでない場合があります。

于 2012-11-28T10:01:47.123 に答える
0

キャッシングだけのようです。最初にディスクから情報を読み取る必要があり、2 回目は既に RAM に格納されています。

行をフェッチするのに 300 ミリ秒は妥当ですか? psql で何が得られますか?

データベースのパフォーマンスを理解したい場合は、少なくとも次の基本的な知識が必要です。

  1. 実行しているハードウェア、特にディスク I/O とシーク時間
  2. クエリプラン ( EXPLAIN経由)
  3. クエリで移動されるデータの量
  4. データベースが肥大化しているかどうかを確認します (適切に構成されていれば、 autovaccumはこれを防ぐ必要があります) 。
于 2012-11-27T11:18:04.747 に答える
0

私がしなければならなかったのは、データベースとの永続的な接続を有効にすることだけでした。その方法についての説明は、こちらで入手できます。

安全か効率的かはわかりませんが、クエリは数百ミリ秒ではなく 20 ミリ秒未満で実行されるようになりました。

于 2012-11-28T12:29:26.937 に答える