Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用“Insert或Ignore”-语句加快Python执行速度_Python_Sql Server_Azure Sql Database_Pyodbc - Fatal编程技术网

使用“Insert或Ignore”-语句加快Python执行速度

使用“Insert或Ignore”-语句加快Python执行速度,python,sql-server,azure-sql-database,pyodbc,Python,Sql Server,Azure Sql Database,Pyodbc,我是pyodbc的新手,遇到了一个执行需要相当长时间的问题。在对脚本进行基准测试时,将962行插入一个表大约需要15分钟。如果可能的话,我想加快这个查询的速度 我运行以下脚本: 光标=连接光标 parsed_json=get_parsed_json_事件_日志 printf“从API中收集数据发现{lenparsed_json}个条目” cursor.fast\u executemany=True cursor.executemanyf 如果不存在,请从{schema_name}.{table_

我是pyodbc的新手,遇到了一个执行需要相当长时间的问题。在对脚本进行基准测试时,将962行插入一个表大约需要15分钟。如果可能的话,我想加快这个查询的速度

我运行以下脚本:

光标=连接光标 parsed_json=get_parsed_json_事件_日志 printf“从API中收集数据发现{lenparsed_json}个条目” cursor.fast\u executemany=True cursor.executemanyf 如果不存在,请从{schema_name}.{table_name}中选择1,其中id=? 插入到{schema_name}.{table_name} 选择 ?, DATEADDs,?,“19700101 02:00:00:000”, ?, ?, DATEADDs,?,“19700101 02:00:00:000”, ?, ?, ?, ?, ?, ?;, 解析的json 我正在使用python 3.8.6和Azure SQL Server。解析后的JSON采用pyodbc文档建议的指定序列格式。DATEADD函数中的强制转换日期信息以全局秒为单位提供

我试图实现INSERT或IGNORE INTO语句,我知道这在SQLite中是可能的。不幸的是,我无法提出Azure SQL Server的实现,因此必须默认为IF NOT EXISTS语句


如果有人能帮助我加快脚本速度或优化语句以加快执行速度,那将是非常棒的。

我多次尝试加快查询速度,并收集了一些见解,希望与所有可能遇到相同问题的人分享:

外卖:

使用Azure SQL Server时,请始终尝试使用插入到。。。价值观语句而不是插入到。。。选择…,因为当针对所描述的问题和使用的语法进行基准测试时,它的执行速度大约快350%。 我使用INSERT的主要原因是。。。选择是因为特定的DATEADD强制转换,因为如果不在Azure SQL Server中显式声明变量,则无法执行此操作。 如果将提供的时间强制转换为python datetime,则可以跳过给定示例中的DATEADD。如果选择此选项,请确保在将数据插入SQL表时不使用文字字符串。除了@Charlieface所述的糟糕做法之外,当使用sequence input结构的字符串文本输入序列时,PYODBC没有该数据类型的内置逻辑在这里没有问题 IF NOT EXISTS语句非常昂贵。如果可能的话,尽量省略它。如果依赖于历史保存表,一个简单的解决方法是创建新创建的第二个表,然后从该表插入到未找到匹配项的原始表。在这里,您可以依赖本机SQL实现而不是PYODBC实现。这条路是迄今为止最快的。 不同的设计选择导致以下性能改进:

插入到。。。选择vs插入到。。。价值…:350% 利用第二个表和本机SQL支持:560%
表是否根据id编制索引?您是否考虑过使用一个表参数,或者对一个临时表进行大容量插入,并从中执行一个连接更新?我希望您不要从用户输入或网上下载中获取schema_name和table_name,因为这会让您对SQL injectionHi@Charlieface敞开大门,在这方面,id是我的表的主键。表本身没有索引。据我所知,bulkinsert仅在希望将文件插入数据库时使用?在我的示例中,数据存储在python列表中,直接从提到的api获取。你能详细说明我如何在这个场景中使用批量插入吗?schema_name和table_name在该脚本的驱动程序方法中指定,因此是硬编码的,而脚本是使用cron执行的。感谢您的快速回答:如果id是表的主键,我假设它是一个聚集索引,请确认。我对Python不太了解,但这篇文章似乎有关于使用表参数的信息。批量插入:很抱歉,该术语实际上是批量复制,它使用类似的快速插入方法,但是TVP可能很简单,为什么不使用过程?Hi@Charlieface,主键是非聚集的,并且不强制执行。将其更改为群集性能方面是否有益?我只是快速阅读了这个概念,因为表的初始创建超出了我的范围。感谢您的回复: