Моя программа 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.
Есть ли способ сделать это не для декодирования? Передача пустой строки в попытке подключения не работает для меня.
Как ответил Дрор Асаф, добавление charset = 'LATIN1' решило мою проблему. Я попробовал fetchmany(). Это не обеспечило заметного улучшения производительности (если что-то немного медленнее). –