pyodbc к SQL Server слишком медленный при получении результатов - PullRequest
0 голосов
/ 22 мая 2018

Я использую ноутбук Юпитера с Python 3 и подключаюсь к базе данных SQL-сервера.Я использую pyodbc версии 4.0.22 для подключения к базе данных.

Моя цель - сохранить результаты SQL в кадре данных pandas, но запрос был таким медленным.

Вот код:

import pyodbc 
cnxn = pyodbc.connect("DSN=ISTPRD02;"
                      "Trusted_Connection=yes;")
ontem = '20180521'

query = "SELECT LOJA, COUNT(DISTINCT RA) FROM VENDAS_CONTRATO(NOLOCK) WHERE DT_RETIRADA_RA = '" + ontem + "' AND SITUACAO IN ('ABERTO', 'FECHADO') GROUP BY LOJA"
start = time.time()
ra_ontem = pd.read_sql_query(query, cnxn)
end = time.time()
print("Tempo: ", end - start)

Темп: 26.379971981048584

Так как это заняло много времени, я наблюдал за сервером базы данных, и для выполнения запроса на сервере требуется около 3 секунд, как вы можетесм. ниже:

query = "SELECT LOJA, COUNT(DISTINCT RA)  FROM VENDAS_CONTRATO(NOLOCK) WHERE DT_RETIRADA_RA = '" + ontem + "' AND SITUACAO IN ('ABERTO', 'FECHADO') GROUP BY LOJA"
start = time.time()
crsr = cnxn.cursor()
crsr.execute(query)
end = time.time()
print("Tempo: ", end - start)

Темп: 3.7947773933410645

start = time.time()
crsr.fetchone()
end = time.time()
print("Tempo: ", end - start)

Темп: 0.2396855354309082

start = time.time()
crsr.fetchall()
end = time.time()
print("Tempo: ", end - start)

Темп: 23.67447066307068

Так что это кажетсяпроблема локальная, когда данные уже получены с сервера базы данных и похоже, что код pyhton работает медленно, когда имеешь дело с данными.

Но у меня только 892 строки!

ra_ontem.shape

(189, 2)

Так что мой вопрос, как я могу сделать это быстрее и загрузить результаты в пандыДатафрейм?

Спасибо

1 Ответ

0 голосов
/ 30 мая 2018

Ваша проблема не с pyodbc, а с sql-сервером.В вашем коде есть две проблемы:
1) вам нужно создать неопределенности в столбцах, которые появляются в предложении "WHERE" (т. е. DT_RETIRADA и SITUACAO).Обратите внимание: если вы всегда постоянно фильтруете SITUACAO по этим двум значениям, вы можете использовать отфильтрованный индекс.Если у вас есть индекс для этих двух полей, лучшим решением будет перестроить индекс.
2) ваш запрос, скорее всего, страдает от "перехвата параметров".Вам нужно больше узнать об этом

...