Python SQL查询执行时间

Python SQL查询执行时间,python,sql,sql-server,performance,Python,Sql,Sql Server,Performance,我几乎没有使用Python和SQL的经验。为了完成硕士论文,我一直在自学 我刚刚编写了一个小脚本,对大约50个结构相同的数据库进行基准测试,如下所示: 导入论文 SQL Server设置 drvr='{SQL Server本机客户端10.0}' 主机='host\u目录' 用户='username' pswd='密码' 表=‘tBufferAux’经检查发现为包含相关数据的表 列='Data' 建立到SQL Server的连接 cnxn=pyodbc.connectdriver=drvr,ser

我几乎没有使用Python和SQL的经验。为了完成硕士论文,我一直在自学

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

导入论文 SQL Server设置 drvr='{SQL Server本机客户端10.0}' 主机='host\u目录' 用户='username' pswd='密码' 表=‘tBufferAux’经检查发现为包含相关数据的表 列='Data' 建立到SQL Server的连接 cnxn=pyodbc.connectdriver=drvr,server=host,uid=user,pwd=pswd安装连接 endRow='从['查询模板中为结束行选择顶部1'+列+' 使用opendesh.db_元数据_路径,“w”作为文件: 对于desis.db_列表中的db: 准备查询 countRows_query='从['+db+'].dbo.+表中选择COUNT* firstRow_query=endRow+db+'].dbo.'+table+'按'+column+'ASC'排序 lastRow_query=endRow+db+'].dbo.'+table+'按'+column+'DESC'排序 执行查询 N_rows=cnxn.cursor.executecountRows\u query.fetchone[0] 第一行=cnxn.cursor.executefirstRow\u query.fetchone 最后一行=cnxn.cursor.executelastRow\u query.fetchone 将输出保存到文本文件 file.writedb+''+strN\u行+''+strfirst\u行.Data+''+strlast\u行.Data+'\n' 闭门会议 cnxn.cursor.close 关闭 我很惊讶地发现这个简单的程序运行了将近10秒,所以我想知道这是否正常,或者我的代码中是否有任何部分可能会降低执行速度。我提醒您,for循环只运行了56次

请注意,来自thesis customized module的任何函数的影响都很小,因为它们都只是变量赋值,除了thesis.db_list(快速读取.txt文件)之外

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

可以很好地测量和比较单个语句和代码块的性能。请注意,在中,有一个内置命令可以更轻松地执行此操作

将度量值分解为每个调用的函数,这样对于大量代码更有用

请注意,独立程序更重要的是,使用解释语言的程序具有启动和关闭开销

对于一个访问数据库的程序来说,10秒加起来看起来不太像

作为测试,我将您的程序包装在探查器中,如下所示:

def main():
<your program>
if __name__=='__main__':
    import cProfile
    cProfile.run('main()')
结果表列出了connect作为单时间hog我的机器是一个非常快的i7 3.9GHz/8GB,本地MSSQL和SSD作为系统磁盘:

7200次函数调用0.058秒内7012次基本调用 ncalls tottime percall cumtime percall文件名:linenofunction 1 0.003 0.003 0.058 0.058 t.py:1主要 1 0.043 0.043 0.043 0.043{pyodbc.connect} date命令显示程序本身运行了大约300ms,总开销为250ms:

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

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

作为旁注,您在first_row/last_row.Data中硬编码了列名。使用getattrfirst\u row,column可以避免这种情况。您使用的列是否按顺序索引?如果没有,可能需要很长时间才能找到第一排和最后一排。@ivan_pozdeev接球不错!我没注意到。谢谢。@JamesZ我不确定该列是否已编入索引。我想这不符合我的想法。不管怎样,考虑到我只运行了一次这个程序,首先对表进行索引是没有意义的,对吗?我的意思是,我猜索引操作需要更长的时间,或者我错了?所以连接调用对最终的持续时间有很大的影响,对吗?因此,我的代码没有什么特别的错误,对吗?谢谢,你的代码没有问题。除了连接和启动之外,在您的案例中可能还有其他阻碍因素,如网络或文件I/O。我测试的数据大约比您的数据少一个数量级。