5

SpringJdbcUtils.extractDatabaseMetaData()メソッドを使用してデータベースを分析しています。この関数はコールバックを呼び出し、オブジェクトを渡しDatabaseMetaDataます。このオブジェクトはを提供しgetColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern)ます。

私はそれをこのように呼びgetColumns("",TABLE_OWNER_USERNAME,null,null) 、結果として400列を取得します。これらはまさに私が望む結果ですが、リクエストには1分以上かかります。

どういうわけかこのクエリを高速に最適化できますか?400行のプルは、1分ではなく1秒で発生するはずです。

編集:私は春の部分が遅いとは思わない。綿密な分析によると、取得にDatabaseMetaDataは数秒かかりますが、実行にgetColumns()は非常に長い時間がかかります。

4

2 に答える 2

2

ALL_TAB_COLUMNS をクエリする方が良い方法かもしれません。次に例を示します。

public final List<Column> getColumnsByOwner(final String owner) {
    final String sql = "SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, "
            + " DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT"
            + " FROM ALL_TAB_COLUMNS"
            + " WHERE OWNER = ? ORDER BY COLUMN_ID";

    return jdbcTemplate.query(sql,
            new Object[] { owner },
            new RowMapper<Column>() {
                @Override
                public Column mapRow(final ResultSet res, final int rowNum)
                        throws SQLException {
                    final Column reg = new Column();

                    reg.setColumnName(res.getString("COLUMN_NAME"));
                    //Read other properties
                    reg.setNullable(res.getString("NULLABLE").equals("Y"));
                    return reg;
                }
            });
}

テーブルでフィルタリングする必要がある場合は、「AND TABLE_NAME = ?」を追加するだけです。別のパラメーターとして sql および tableName に。

それが役に立てば幸い。

于 2012-07-03T20:26:18.147 に答える