2015-03-30 1 views
1

Моя программа python 2.7 много читает с SQL-сервера. Один из столбцов определяется как VARCHAR (40), и обычно держат строку длиной около 20. Когда я профиль мой код, я нашел большое количество времени уходит на декодирование строки:Производительность чтения varchar с SQL-сервера с использованием pymssql

ncalls tottime percall cumtime percall filename:lineno(function) 
919870 1.133 0.000 1.133 0.000 {_codecs.utf_8_decode} 
919870 0.463 0.000 1.596 0.000 utf_8.py:15(decode) 

Пример кода есть (чтение миллионы строк):

cursor = db.cursor() 
cursor.execute("select qaid, value from DATA") 
rows = cursor.fetchall() 
for row in rows: 
    qaid, value = row 
    values[ qaid ] = value 

Это, кажется, исходит из _mysql, который автоматически декодировать данные, поступающие от сервера SQL, если тип данных VARCHAR.

elif dbtype in (SQLVARCHAR, SQLCHAR, SQLTEXT): 
    if strlen(self._charset): 
     return (<char *>data)[:length].decode(self._charset) 
    else: 
     return (<char *>data)[:length] 

База данных сконфигурирована с использованием сопоставления Latin1_General_BIN. Я использую python 2.7. Строки, которые меня интересуют, всегда ASCII.

Есть ли способ сделать это не для декодирования? Передача пустой строки в попытке подключения не работает для меня.

+0

Как ответил Дрор Асаф, добавление charset = 'LATIN1' решило мою проблему. Я попробовал fetchmany(). Это не обеспечило заметного улучшения производительности (если что-то немного медленнее). –

ответ

0

Если база данных использует определенную кодировку набора символов, ее можно передать функции подключения в качестве параметра с именем charset.

кодировка по умолчанию для любого соединения является «UTF-8»

pymssql.connect(server='.', user='', password='', database='', timeout=0,  
login_timeout=60, charset='UTF-8', as_dict=False, host='', appname=None,  
port='1433', conn_properties) 

http://pymssql.org/en/latest/ref/pymssql.html

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

Это обсуждалось ранее here

Использование в fetchall функции может привести к плохой производительности, если таблица в базе данных имеет много записей, пожалуйста, рассмотреть вопрос тестирования с несколькими вызовами fetchmany.

Смежные вопросы