Python SQL查询执行时间

时间:2015-02-08 00:55:54

标签: python sql sql-server performance

我没有使用Python和SQL的经验。我一直在学习,以便完成硕士论文。

我刚刚编写了一个小脚本来对大约50个结构相同的数据库进行基准测试,如下所示:

import thesis,pyodbc

# SQL Server settings
drvr = '{SQL Server Native Client 10.0}'
host = 'host_directory'
user = 'username'
pswd = 'password'
table = 'tBufferAux' # Found (by inspection) to be the table containing relevant data
column = 'Data'

# Establish a connection to SQL Server
cnxn = pyodbc.connect(driver=drvr, server=host, uid=user, pwd=pswd) # Setup connection

endRow = 'SELECT TOP 1 ' + column + ' FROM [' # Query template for ending row
with open(thesis.db_metadata_path(),'w') as file:
    for db in thesis.db_list():
        # Prepare queries
        countRows_query = 'SELECT COUNT(*) FROM [' + db + '].dbo.' + table
        firstRow_query = endRow + db + '].dbo.' + table + ' ORDER BY ' + column + ' ASC'
        lastRow_query = endRow + db + '].dbo.' + table + ' ORDER BY ' + column + ' DESC'
        # Execute queries
        N_rows = cnxn.cursor().execute(countRows_query).fetchone()[0]
        first_row = cnxn.cursor().execute(firstRow_query).fetchone()
        last_row = cnxn.cursor().execute(lastRow_query).fetchone()
        # Save output to text file
        file.write(db + ' ' + str(N_rows) + ' ' + str(first_row.Data) + ' ' + str(last_row.Data) + '\n')

# Close session
cnxn.cursor().close()
cnxn.close()

我很惊讶地发现这个简单的程序需要花费大约10秒的时间才能运行,所以我想知道这是否正常或者我是否有任何部分代码可能会降低执行速度。 (我提醒你,for循环只运行了56次)

请注意,thesis(自定义)模块中的任何函数都没有什么影响,因为它们都只是变量赋值(thesis.db_list()除外,这是一个快速.txt文件读取)

编辑:This是此程序生成的输出.txt文件。第二列是每个数据库的该表的记录数。

1 个答案:

答案 0 :(得分:0)

  • timeit可以衡量和比较单个语句和代码块的性能(请注意,在iPython中,有一个内置命令可以更轻松地执行此操作)

  • Profilers将测量分解为每个被调用的函数(因此对于大量代码更有用)。

  • 请注意,独立程序(更多是解释语言中的程序)具有启动(和关闭)开销。

结合起来,对于访问数据库的程序来说,10秒看起来并不是很好。

作为测试,我将您的程序包装在这样的分析器中:

def main():
<your program>
if __name__=='__main__':
    import cProfile
    cProfile.run('main()')

cygwin&#39; s bash这样运行:

T1=`date +%T,%N`; /c/Python27/python.exe ./t.py; echo $T1; date +%T,%N

结果表列出了connect作为单次生猪(我的机器是非常快的i7 3.9GHz / 8GB,本地MSSQL和SSD作为系统磁盘):

     7200 function calls (7012 primitive calls) in 0.058 seconds

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
<...>
     1    0.003    0.003    0.058    0.058 t.py:1(main)
<...>
     1    0.043    0.043    0.043    0.043 {pyodbc.connect}
<...>

date命令显示程序本身运行了大约300毫秒,总开销为250毫秒:

<...>:39,782700900
<...>:40,072717400

(通过从命令行中排除python,我确认其他命令的开销可以忽略不计 - 大约7us)