2012-05-29 3 views
1

У меня есть представление sql, которое возвращает более 10 000 записей с примерно 120 столбцами (смешно, я знаю).Zend Fetch на большом столе 10 000 + строк, ~ 100 столбцов

Данные представления собираются из базы данных на PHP с использованием объекта Zend_Db_Table_Abstract. У нас есть контроллер отчетов, который выполняет fetchAll (который, очевидно, создает массивный массив) и сохраняет массив в объекте представления. Затем у нас есть сценарий вида, который выполняет итерацию по массиву и перекликается с форматированным массивом json.

Это медленно. Как более 1 минуты, чтобы сделать этот отчет, что я могу сделать, чтобы ускорить это?

Готов к сведению, что я очень новичок в этом проекте и не знаю Zend и немного о PHP. Кроме того, я не могу отказаться от многих из-за защиты данных и т. Д.

Если вы могли бы спросить, что вам нужно, чтобы помочь вам собрать картину, которая была бы замечательной. Но в основном это то, что делает скрипт:

Report Контроллер:

Setup some basic json report data (for data tables) 
$this->view->report_data = fetchALL($oSelect); 

Просмотр сценария:

Output the basic json stuff, then: 
"report_data": [ 
<?php 
    for($i = 0; $i < count($this->report_data); $i++){ 
     echo "["; 
     foreach($this->columns as $k=>$col){ 
      echo '"'. $this->escape($this->report_data[$i][$col]) .'"'; 
      if($k < count($this->columns) -1){ 
       echo ','; 
      } 
     } 
     echo "]"; 
     if($i < count($this->report_data) -1){ 
      echo ","; 
     } 
     echo"\n"; 
    } 
?> ] 

Таким образом, после выполнения некоторых исследований я понял, что я мог бы использовать выборку() вместо fetchAll(), чтобы получить 1 строку за раз, чтобы избежать массивного массива. Однако я пытался использовать выборку() и получил эту ошибку:

Призыв к неопределенному методу Zend_Db_Table_Abstract::fetch()

Так что теперь я стрельнул.

Моя идея состояла в том, чтобы получить каждую строку и выводить каждую строчку Json, но я не знаю, как это сделать в сценарии контроллера отчетов/просмотра. Должен ли я просто избавиться от сценария вида и просто использовать контроллер для вывода данных?

Во всяком случае почему fetch() не работает, я не могу реально увидеть его в документации либо, а есть некоторый массив function _fetch()

Любая помощь будет оценена, любой, если вам нужно больше информации просто спросите. Thanks

+0

На ваш взгляд, вы показываете все эти 10 000 записей на одной странице? Я не знаком с Zend, но обычно, когда одиночные запросы становятся слишком тяжелыми, вы можете использовать пейджинг. Таким образом, вы не получаете и не показываете сразу все данные, но в приличных размерах. Может быть, может помочь Zend Paginator? – hade

+1

Сначала убедитесь, что php является узким местом. Запустите свой запрос через консоль phpmyadmin или mysql, чтобы убедиться, что он даже работает быстро там. – Maerlyn

+0

Просмотр занимает около 2 секунд для загрузки через командную строку psql. @hade Вид выводит всю массу записей в формате json. Затем для обработки этого используются данные, которые отображают/разбивают на страницы. –

ответ

0

См. Документы для fetch().

Следующая не очень элегантно, но может помочь вам:

Модель:

... 
function getResults() 
{ 
    return $db->query('SELECT * FROM bugs'); 
} 
... 

Контроллер:

... 
$this->view->report_data = $model->getResults(); 
... 

Вид:

... 
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) { 
    echo Zend_Json::encode($row); 
} 
... 

Я убежищем» t проверил код, но вы должны получить эту идею.

+0

Thnaks для этого, давая ему сейчас –

+0

Atm Я получаю результаты в контроллере так: $ this-> view-> report_data = $ view-> fetchAll ($ oSelect); Вы упоминаете, что делать выборку в скрипте представления, однако я не могу получить доступ к объекту $ view в сценарии вида:/ –

+0

Делает ли это $ this-> report_data-> fetch()? – Boby

0

Вы должны импровизировать использование рамок здесь, чтобы получить, что дополнительный бит производительности

В контроллере

$this->view->result = mysql_query($sql); 

Ввиду

while ($row = mysql_fetch_assoc($this->result)) { 
echo json_encode($row); 
} 

Примечание для настройки процедуры MySQL интерфейс чтения http://php.net/manual/en/function.mysql-fetch-assoc.php

+0

Я использую postgress, поэтому я не знаю, как это будет работать для меня. –

0

Как вы поняли из сообщения об ошибке Zend_Db_Table_Abstract не имеет метода fetch(). Это, однако, есть fetchRow() метод, который имеет эту подпись: -

/** 
* Fetches one row in an object of type Zend_Db_Table_Row_Abstract, 
* or returns null if no row matches the specified criteria. 
* 
* @param string|array|Zend_Db_Table_Select $where OPTIONAL An SQL WHERE clause or Zend_Db_Table_Select object. 
* @param string|array      $order OPTIONAL An SQL ORDER clause. 
* @param int        $offset OPTIONAL An SQL OFFSET value. 
* @return Zend_Db_Table_Row_Abstract|null The row results per the 
*  Zend_Db_Adapter fetch mode, or null if no row found. 
*/ 
public function fetchRow($where = null, $order = null, $offset = null) 

Так заменяющий выборки() с FetchRow() и зацикливание, а !null === fetchRow() должны работать для вас.

Всегда полезно вникать в код Zend Framework, чтобы узнать, что предлагается.

Zend Paginator также может быть для вас вариантом, поскольку он просто извлекает записи, необходимые для визуализации страницы.

+0

Я не могу заставить это работать, кажется, что каждый раз возвращает первую строку: while ($ this-> view-> report_data = $ view-> fetchRow ($ oSelect)) { echo Zend_Json: : кодирование ($ строка); } –