0

Accessデータベースの3つのテーブルから最大200万行、おそらく100MBのテキストから大量のデータを読み取っています。次のSELECTステートメントを使用していました。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
String url = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=" + databaseLocation + databaseName +";selectMethod=cursor; READONLY=true; TYPE=FASTLOAD";

con = DriverManager.getConnection(url);

String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY, BUILDINGS.ED_ID FROM (ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID WHERE BUILDINGS.COUNTY_ID = " + county_ID;

Statement stmt = con.createStatement();
ResultSet result = stmt.executeQuery(SQL);

これにはしばらく(約2分)かかっていたので、もっと速くする方法を探しました。プリペアドステートメントについて読んで、作ってみることにしました。さまざまなチュートリアルに従って、これをまとめました。

String SQL = "SELECT ADDRESS_MODEL.ADDR_LINE_1, ADDRESS_MODEL.ADDR_LINE_2, LOCALITIES.NAME, ADDRESS_MODEL.SECONDARY_LOCALITY, ADDRESS_MODEL.POST_TOWN, ADDRESS_MODEL.COUNTY, BUILDINGS.ED_ID FROM (ADDRESS_MODEL LEFT JOIN BUILDINGS ON ADDRESS_MODEL.BUILDING_ID = BUILDINGS.BUILDING_ID) LEFT JOIN LOCALITIES ON BUILDINGS.LOCALITY_ID = LOCALITIES.LOCALITY_ID WHERE BUILDINGS.COUNTY_ID = ?";

PreparedStatement prest = con.prepareStatement(SQL);
prest.setString(1, county_ID);

ResultSet result = prest.executeQuery();

それでも動作しますが、現在は15分以上かかります。私は良いグーグルを持っていましたが、私が間違っていることを見つけることができないようです。プリペアドステートメントは私の特定の問題に適切ではありませんか?

4

1 に答える 1

1

PreparedStatementを使用することによる主なパフォーマンスの向上は、同じクエリを複数回実行する場合に得られます。データベースは、ステートメントの準備時にクエリを作成し、ステートメントが実行されるたびにこれを再利用して、オーバーヘッドを回避します。クエリを1回だけ実行している場合は、PreparedStatementを使用してもパフォーマンスが向上しない可能性があります。

PreparedStatementを使用するための主な議論は、SQLインジェクションから保護することです

于 2012-08-06T19:50:43.010 に答える