2010-04-27 174 views
0

我使用pymssql从python插入记录到sql server。数据库需要2毫秒来执行查询,但它每秒插入6行。唯一的问题是在代码方面。如何优化以下代码或插入记录的最快方法。优化pymssql代码

def save(self): 
    conn = pymssql.connect(host=dbHost, user=dbUser, 
          password=dbPassword, database=dbName, as_dict=True) 
    cur = conn.cursor() 

    self.pageURL = self.pageURL.replace("'","''") 

    query = "my query is there"    
    cur.execute(query) 

    conn.commit() 
    conn.close() 

回答

4

它看起来像你正在创建一个新的连接每插入那里。这可能是经济放缓的主要原因:建立新的连接通常非常缓慢。在方法外部创建连接,您应该看到很大的改进。你也可以在函数外创建一个游标并重新使用它,这将是另一个加速。

根据您的情况,您可能还希望使用同一事务进行多次插入。这会稍微改变行为 - 因为事务应该是原子的,并且要么完全成功,要么完全失败 - 但是提交事务通常是一个缓慢的操作,因为必须确保整个操作成功。

+0

@Thomas谢谢它的工作原理。我已经尝试了外部连接对象的方法,但速度仍然很低。当将autocommit属性设置为True时,速度会提高。 – developer 2010-04-28 05:23:22

2

除了托马斯的伟大的意见,
我建议你看看executemany() *,e.g.

cur.executemany("INSERT INTO persons VALUES(%d, %s)", 
    [ (1, 'John Doe'), (2, 'Jane Doe') ]) 

...其中的executemany()第二个参数应是行插入序列。

这带来了另一个问题:
你可能想送您的查询,查询参数作为独立参数要么​​或executemany()。这将允许PyMSSQL模块为您处理任何引用问题。

* executemany()Python DB-API描述:

.executemany(operation,seq_of_parameters)
准备一个数据库操作(查询或 命令),然后执行它针对 序列 seq_of_parameters中找到的所有参数序列或映射 。

+0

感谢您的提示 – developer 2010-04-28 05:23:50