0

私はpymssqlを使用してPythonからSQLサーバーにレコードを挿入しています。データベースはクエリを実行するのに 2 ミリ秒かかりますが、1 秒あたり 6 行を挿入します。唯一の問題はコード側にあります。次のコードを最適化する方法、またはレコードを挿入する最速の方法は何ですか。

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

2 に答える 2

4

そこに挿入ごとに新しい接続を作成しているようです。これがおそらく速度低下の主な理由です。通常、新しい接続の構築は非常に遅くなります。メソッドの外部で接続を作成すると、大幅な改善が見られるはずです。関数の外側にカーソルを作成して再利用することもできます。これは別のスピードアップになります。

状況によっては、複数の挿入に同じトランザクションを使用することもできます。トランザクションはアトミックであり、完全に成功するか完全に失敗するかのいずれかであると想定されているため、これにより動作が少し変わりますが、トランザクションのコミットは、操作全体が成功したことを確認する必要があるため、通常は遅い操作です。

于 2010-04-27T12:28:07.263 に答える
3

Thomas の素晴らしいアドバイスに加えて、*を調べる
ことをお勧めします。executemany()

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

... の 2 番目の引数は、executemany()挿入する行のシーケンスでなければなりません。

これは別のポイントをもたらします:
おそらく、クエリとクエリ パラメータを別々の引数としてexecute()またはのいずれかに送信する必要がありますexecutemany()。これにより、PyMSSQL モジュールが引用の問題を処理できるようになります。

* Python DB-APIexecutemany()で説明されているとおり:

.executemany(operation,seq_of_parameters)
データベース操作 (クエリまたはコマンド) を準備し、シーケンス seq_of_parameters で見つかったすべてのパラメーター シーケンスまたはマッピングに対して実行します。

于 2010-04-27T16:05:21.417 に答える