2012-11-27 3 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에 있습니다.

행을 가져 오는 데 300 밀리미터가 적당합니까? psql을 통해 무엇을 얻나요? 시간 을 당신이 실행하는 어떤 하드웨어

  1. , 특히 디스크 I/O 추구 : 당신은 당신의 데이터베이스의 성능을 이해하려면

    당신은 적어도 기본적인 이해를해야합니다 데이터베이스가 비 대한되는 경우

  2. 쿼리에 대한 이동하는 데이터의 양 (EXPLAIN를 통해)
  3. 쿼리 계획이
  4. 알고
  5. (적절하게 구성된 경우 autovaccum이되지 않도록해야한다)
+0

아니요 - 서버가 디스크 내용을 캐싱하므로 디스크의 해당 부분을 다시 읽으려고하면 이미 RAM에 있습니다. –

+0

1. 그 캐시 파일은 각각 약 5kB에 불과합니다. file_get_contents()는 시간이 없어 (~ 1ms) 그들을 처리합니다. 2. 한 행에 2KB 미만의 데이터가 있습니다. 4. 'images'테이블에는 ~ 3000 개의 행이 있습니다. 나는 pgadmin에서 zend에 의해 생성 된 쿼리를 실행했고 ~ 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; 
} 

} 여기에 쿼리를 작성하는 다양한 방법의 예를 몇 (더 많은있다)

, 그들은 또는 성능 향상에 도움이되지 않을 수 있습니다.