sqlalchemy Resultproxy Медленно на больших столах? - PullRequest
0 голосов
/ 20 февраля 2010

Привет, я использую sqlalchemy для таблицы db2 с 500k строк.

используя обычный sql, как это:

 sql="select * from test.test"
 result=Session.execute(sql)
 for row in result:
      pdic[row.id]=row.val1

это занимает 5 минут

если я использую ibm_db:

 sql="select * from test.test"
 stmt = ibm_db.exec_immediate(ibm_db_conn,sql)
 result =ibm_db.fetch_both(stmt)   
 while(result):
         pathdic[result['ID']]=result['VAL']
         result = ibm_db.fetch_both(stmt)   

это занимает менее 30 секунд

Есть идеи?

1 Ответ

1 голос
/ 24 февраля 2010

Если вы используете DB2 для Linux, UNIX и Windows, существуют сложные средства трассировки, называемые мониторами событий , которые встроены в базу данных для сбора подробной информации о рабочей нагрузке SQL, отправляемой вашим приложением. Если SQLAlchemy неэффективно обращается к DB2, вы увидите другую серию событий, захваченных монитором событий оператора. Другая возможность состоит в том, что обе версии программы используют данные DB2 примерно одинаково, но SQLAlchemy тратит больше времени «вне DB2», выделяя внутренние объекты для хранения результатов. Я использую мониторы событий операторов, которые пишут в таблицы, чтобы я мог искать все виды проблем и шаблонов, поэтому я включил ссылку на утилиту DB2, которая значительно упрощает определение монитора событий и таблиц, которые будут содержать его выходные данные. После этого вам просто нужно будет

SET EVENT MONITOR YourMonitorName STATE 1

, чтобы запустить его, и

SET EVENT MONITOR YourMonitorName STATE 0

чтобы выключить его. Отключение этой части очень важно, поскольку каждый оператор SQL, выполняемый при включенном мониторе, генерирует от 3 до 5 строк данных в таблице монитора событий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...