【问题标题】:Performance of reading varchar from SQL server using pymssql使用 pymssql 从 SQL Server 读取 varchar 的性能
【发布时间】:2015-06-03 20:15:05
【问题描述】:

我的 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。

有没有办法让它不解码?将空字符集传递给连接尝试对我不起作用。

【问题讨论】:

  • 正如 Dror Asaf 所回答的,添加 charset='LATIN1' 解决了我的问题。我尝试了 fetchmany()。它没有提供明显的性能改进(如果有的话,它会稍微慢一些)。

标签: python sql-server utf-8 pymssql


【解决方案1】:

如果数据库使用特定的字符集编码,可以将其作为一个名为 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 对其进行测试。

【讨论】:

    猜你喜欢
    • 2012-07-15
    • 2016-08-18
    • 2012-12-27
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-07
    • 2014-12-02
    相关资源
    最近更新 更多