2012-11-27 35 views
1

最近我問是否有某種方法可以讓我的查詢更快地執行(主題:Slow postgresql queries in Zend)。我擺脫了「描述」查詢,導致20-30%的提升。但我的疑問仍然太慢。Zend中緩慢的Postgres查詢

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

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

我對我的應用程序進行了剖析,發現單個getImage()調用持續約300ms。但是如果我將它調用兩次,那麼第二次調用大約持續15ms。我能做些什麼來使所有查詢執行得這麼快?

我也100%確定沒有描述查詢了 - 我查看了數據庫查詢日誌,所有查詢看起來都很完美。

回答

0

我只需要啓用持久連接與我的數據庫。 有關如何做到這一點的解釋可用here

我不確定它是否安全或有效,但現在我的查詢在20ms而不是幾百毫秒內執行。

0

聽起來就像它只是緩存。第一次它必須從磁盤讀取信息,第二次它已經在RAM中。

300ms是否適合用於獲取行 - 您通過psql獲得了什麼?

如果你想了解你的數據庫的性能,你需要有至少一個基本的把握:您正在運行在什麼樣的硬件

  1. ,特別是磁盤I/O和尋道時間
  2. 查詢計劃(通過EXPLAIN
  3. 多少數據查詢中移動約
  4. 瞭解你的數據庫變得臃腫(autovaccum應防止這一點,如果適當配置)
+0

否 - 服務器將緩存磁盤內容,因此當它試圖再次讀取該磁盤部分時,它已經在RAM中。 –

+0

1.這些緩存文件每個僅約5kB - file_get_contents()立即處理它們(〜1ms)。2.單行少於2kB的數據。 4.'images'表包含〜3000行。 我執行了由zend在pgadmin中創建的查詢,他們花費了每個〜15ms。也許每次我的控制器啓動時都會初始化一個新的連接。我如何防止這種情況發生? – jacek11

+0

那麼......任何想法? – jacek11

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; 
    } 
} 

或:

類Application_Model_DbTable_Images延伸Zend_Db_Table_Abstract { 保護$ _name = '圖像';

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

}

以下幾個不同的方法來構建查詢的例子(還有更多),他們可能會或可能不會幫助你的表現。