WEB开发网
开发学院数据库DB2 在DB2优化器中使用分布统计信息 阅读

在DB2优化器中使用分布统计信息

 2009-12-23 15:00:17 来源:WEB开发网   
核心提示:仅在收集了一个表中至少一个列的分布统计信息时,SYSCAT.COLDIST 才会包含关于该表的条目,在DB2优化器中使用分布统计信息(6),如果在没有 WITH DISTRIBUTION 的情况下再次执行 RUNSTATS,那么 SYSCAT.COLDIST 中与该表对应的条目将被删除,然而,Java 开发人员使用 P

仅在收集了一个表中至少一个列的分布统计信息时,SYSCAT.COLDIST 才会包含关于该表的条目。如果在没有 WITH DISTRIBUTION 的情况下再次执行 RUNSTATS,那么 SYSCAT.COLDIST 中与该表对应的条目将被删除。

分布统计信息和参数标记/主变量

JDBC 提供了两种途径来执行动态 SQL,因而也提供了两种不同的接口:

java.sql.Statement

java.sql.PreparedStatement

PreparedStatement 是 Statement 的子接口,它允许使用参数标记(= 占位符;在其他编程语言中,此类占位符也被称为主变量) —— 而不是 Statement。在使用 PreparedStatement 的情况下,首先编译要执行的包括参数标记的 SQL 语句,然后将值绑定到参数标记,最后执行 SQL 语句。

下面的代码片段显示使用 Statement 与使用 PreparedStatement 的不同之处。

清单 3. 使用 JDBC Statement 接口执行动态 SQL

java.sql.Connection con = ...;
java.sql.Statement stmt1 = con.createStatement();
String insert1 = "INSERT INTO TABLE_X (COL_Y) VALUES ('ABC')";
stmt1.executeUpdate(insert1);
java.sql.Statement stmt2 = con.createStatement();
String insert2 = "INSERT INTO TABLE_X (COL_Y) VALUES ('XYZ')";
stmt2.executeUpdate(insert2);
con.commit();

清单 4. 使用 JDBC PreparedStatement 接口执行动态 SQL

java.sql.Connection con = ...;
String insert = "INSERT INTO TABLE_X (COL_Y) VALUES (?)";
java.sql.PreparedStatement pstmt = con.prepareStatement(insert);
pstmt.setString(1, "ABC");
pstmt.executeUpdate();
pstmt.setString(1, "XYZ");
pstmt.executeUpdate();
con.commit();

如果一条简单 SQL 语句执行多次(例如示例中的 INSERT 语句),那么使用 PreparedStatement 有优势,因为数据库只需编译该语句一次,即可多次执行,而不需要重复编译。假设在示例中需要插入数千行记录,那么使用 PreparedStatement 可以交付更短的执行时间,因为只需一次准备/编译时间,而不需要数千次。

然而,Java 开发人员使用 PreparedStatement 往往是因为需要在运行时提供值/过滤器标准时,使用这种接口编写的代码更为优雅。请看如下代码片段:

清单 5. 使用字符串串联填充过滤标准

int state = 100;
String type = "A";
...
java.sql.Connection con = ...;
java.sql.Statement stmt = con.createStatement();
String select = "SELECT * FROM CARS WHERE
STATE < " + state + " AND TYPE = '" + type + "'";
java.sql.ResultSet rs = stmt.executeQuery(select);
while (rs.next()) {
  ...
}

清单 6. 使用参数标记填充过滤标准

int state = 100;
String type = "A";
...
java.sql.Connection con = ...;
String select = "SELECT * FROM CARS WHERE STATE < ? AND TYPE = ?";
java.sql.PreparedStatement pstmt = con.prepareStatement(select);
pstmt.setInt(1, state);
pstmt.setString(2, type);
java.sql.ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
  ...
}

上一页  1 2 3 4 5 6 7  下一页

Tags:DB 优化 使用

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接