テーブルから1列(600万行)を選択するJava Webアプリケーションがあり、CPU時間がかかる。このselect(SELECT id FROM mytable WHERE filename = 'unique_filename')は、クエリブラウザで実行すると時間が大幅に短縮されます。なぜSQLでの選択でJavaでCPU時間がかかるのですか?
これはどうしてですか?
どこでボトルネックを探す必要がありますか?データベースオブジェクトは、接続オブジェクトを受信するためのDriverManagerを使用
ResultSet rs = null;
PreparedStatement stmt = null;
Connection conn = null;
Integer myId=null;
String myVeryUniqueFileName = strFromSomeWhere;
try
{
conn = Database.getConnection();
stmt = conn.prepareStatement("SELECT id FROM mytable WHERE filename = ?");
stmt.setString(1, myVeryUniqueFileName);
rs = stmt.executeQuery();
if (rs.next())
{
myId= new Integer(rs.getInt(1));
} }
if (rs.next())
{
throw new DBException("Duplicate myId: " + myId);
}
return myId;
} catch (Exception e) {
// handle this
}
1.Javaコード:
データベースは Javaコンテナが(sqljdbc 1.2)のTomcat 5.5
詳細あるMSSQL 2005規格
であります。
2.SQLテーブルのカラム数は約30です。
CREATE TABLE [dbo].[calls](
[id] [int] NOT NULL,
...
[filename] [varchar](50) NOT NULL,
...
CONSTRAINT [PK_xxxxxxxxxxxx] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY],
CONSTRAINT [UQ_xxxxxxxxxxxx] UNIQUE NONCLUSTERED
(
[filename] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
ファイル名の列が一意であるため、結果セットはallways 1またはnullです。
あなたがCPU時間を言うとき、あなたは、Javaが使用するCPUを意味していますアプリケーションまたはデータベースサーバーで使用されるCPUそれらは2つの異なるマシンにありますか? –
TomcatとMSSQLは同じサーバーにありますか?あなたのJavaアプリケーションは、どのオブジェクトに6百万のID値を格納していますか? Javaと.NETはメモリ内の各オブジェクトを作成して破壊する時間を必要とします.600万のオブジェクトを作成する必要がある場合は、かなりの時間がかかります。 –
これは本当の質問ではありません。それはあまり詳しくはないが、OPはまだそれを修正するかもしれない。 – ChssPly76