PYODB C fetchall () работает очень медленно в IBM ISeries DB2 - PullRequest
0 голосов
/ 23 января 2020

Я работаю.

DB2 V7R3

PYTHON 3,8.

Я пытаюсь подключиться к базе данных DB2 без проблем.

Я использую Pyodbc

ДРАЙВЕР: Iseries ACCESS ODB C ДРАЙВЕР --- - ODB C: 32-битный

Я даже использую CCSID для правильного кодирования, я получаю на 4 секунды больше с указанным CCSID, чем без.

Соединение быстрое, и даже очень быстро получается столбец cursor.description.

Но когда я подхожу к fetchall () для строк, где замедляются ветки, он получает 1000 строк за 5,431816339492798 секунд на один столбец. В клиенте это занимает 0,5 секунды. Если развернуть результат до моего актуального запроса, потребуется 6000 секунд для 6000 строк в 5 столбцах.

Я проверил время нахождения над строками с помощью fetchmany () и получил 95 секунд для моего фактического запроса. Мой актуальный запрос занимает 1,5 секунды для чтения в клиенте.

Вот мой код:

import pyodbc
import time 

def connect_odbc():
    start_time = time.time()
    list_row = []
    connection = pyodbc.connect(DRIVER='iSeries Access ODBC Driver',
                            SYSTEM='SYSTEM',
                            DNS='DNS,
                            userid='user',
                            pwd='pass',
                            CCSID = 'My_Value'
                            ) 



cursor = connection.cursor().execute("select columns from table where column = value limit 1000"
columns = [column[0] for column in cursor.description]
for r in cursor.fetchall():
    pass

print("--- %s seconds ---" % (time.time() - start_time))

connect_odbc()

OUTPUT = --- 5.431816339492798 секунд ---

Я знаю, что этот вопрос был задан, но я искал по inte rnet и пробовал сервалы, но безрезультатно.

Какая модификация в конфигурации ODB C могла бы сделать это быстрее?

Есть ли у них какой-либо вариант, кроме fetchall()? на мой взгляд, кажется, что fetchall() все замедляет.

любая помощь будет оценена

...