使用 pymssql 从 SQL 服务器读取 varchar 的性能
Performance of reading varchar from SQL server using pymssql
我的 python 2.7 程序从 SQL 服务器进行大量读取。其中一列定义为 varchar(40),通常包含一个长度约为 20 的字符串。当我分析我的代码时,我发现大部分时间都花在解码字符串上:
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,如果数据类型是 varchar,它会自动解码来自 SQL 服务器的数据。
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 的参数传递给连接函数。
任何连接的默认编码都是"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
如果数据库中的 table 有很多条目,使用 fetchall 函数可能会导致性能不佳,请考虑多次调用 fetchmany 进行测试。
我的 python 2.7 程序从 SQL 服务器进行大量读取。其中一列定义为 varchar(40),通常包含一个长度约为 20 的字符串。当我分析我的代码时,我发现大部分时间都花在解码字符串上:
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,如果数据类型是 varchar,它会自动解码来自 SQL 服务器的数据。
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 的参数传递给连接函数。
任何连接的默认编码都是"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
如果数据库中的 table 有很多条目,使用 fetchall 函数可能会导致性能不佳,请考虑多次调用 fetchmany 进行测试。