mysql:13950
From: <kinosita@xxxxxxxxxx>
Date: Wed, 09 May 2007 11:45:55 +0900
Subject: [mysql 13950] ストアドプロシージャを使うと遅くなる??
はじめまして。木下弘基と申します。
現在 MySQL 5.0.37 (WinXP) + C API で大量データを登録する
プログラムの開発に先立ち、簡単なサンプルを作り調査をしています。
プログラムの都合上データは動的に生成し、その都度登録する必要があるため、
ファイル経由(LOAD DATA LOCAL INFILE~)ではなく、ストアドプロシージャで
実現しようと考えています。
ところが、素のINSERT文を繰り返し実行するよりも、ストアドプロシージャで
登録・呼び出す方が処理時間がかかり、プロペアドステートメントならば
素のINSERT文よりやや早いという結果が出てしまいました。
素のINSERT文を10万回実行・・・・・33秒
ストアドプロシージャ経由で登録・・・39秒
プリペアドステートメントで登録・・・29秒
本来のプログラムで扱うデータの件数は数百万件、
INSERTでなくUPDATEの場合もあります。
お聞きしたい点は次の通りです。
Q1. (このサンプルデータにおいて)ストアドプロシージャの方が
遅くなるのは、現時点でのMySQLの特性と考えるべきでしょうか?
Q2. Oracleの様に、ストアドプロシージャに対してバインド変数を
受け渡す方法はありますか?
(API、サンプルを見る限りこれは無さそうですが・・)
Q3. 他に何か高速に登録する手段は考えられるでしょうか?
実行した内容は次の通りです。
■ INSERT文そのままの実行例
for (nCnt = 1; nCnt <= 100000; nCnt ++) {
sprintf(cSQL, "INSERT INTO proc_tb VALUES (%d,'%s%d','%s');",
nCnt, "testdata", nCnt, "2007/05/08 10:10:18");
mysql_query(mysql, cSQL);
}
■ ストアドプロシージャ経由での実行例
char *gcInsProc =
"CREATE PROCEDURE PROC_INSERT"
"( IN in_no INT,"
" IN in_text TEXT,"
" IN in_day DATETIME"
")"
"BEGIN"
" INSERT INTO proc_tb VALUES (in_no, in_text, in_day);"
"END;";
...
for (nCnt = 1; nCnt <= 100000; nCnt ++) {
sprintf(cSQL, "call PROC_INSERT(%d,'%s%d','%s');",
nCnt, "testdata", nCnt, "2007/05/08 10:10:18");
mysql_query(mysql, cSQL);
}
■ プリペアドステートメントでの実行例
char *gcInsPrepare = "INSERT INTO proc_tb VALUES (?, ?, ?)";
stmt = mysql_stmt_init(mysql);
mysql_stmt_prepare(stmt, gcInsPrepare, strlen(gcInsPrepare));
memset(bind, 0, sizeof(bind));
/* INTEGER PARAM */
/* This is a number type, so there is no need
to specify buffer_length */
bind[0].buffer_type= MYSQL_TYPE_LONG;
bind[0].buffer= (char *)&int_data;
bind[0].is_null= 0;
bind[0].length= 0;
...
/* Bind the buffers */
mysql_stmt_bind_param(stmt, bind);
for (nCnt = 1; nCnt <= 100000; nCnt ++) {
int_data = nCnt;
sprintf(str_data, "%s%d", "testdata", nCnt);
str_length = (unsigned long)strlen(str_data);
...
mysql_stmt_execute(stmt);
}
mysql_stmt_close(stmt);
以上です。宜しくお願いします。
-> 13950 2007-05-09 11:45 [<kinosita@xxxxxxxxxx] ストアドプロシージャを使うと遅くなる?? 13951 2007-05-09 14:02 ┗[HIRATSUKA Sadao <hir] 13952 2007-05-09 16:40 ┗[<kinosita@xxxxxxxxxx]