使用pymssql从SQL server读取varchar的性能



我的python 2.7程序从SQL server中读取了大量内容。其中一列被定义为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 server的数据。

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的参数传递给connect函数。

任何连接的默认编码都是"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

请注意,关于性能,它可能与光标的使用有关。

前面已经对此进行了讨论

如果数据库中的表有很多条目,使用fetchall函数可能会导致性能不佳,请考虑使用多次调用fetchmany来测试它。

最新更新