2010-04-27 157 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