2

我有一个 Oracle 12c 数据库查询,它每天提取一个 13 列和超过 114470 行的表。

在我将相同的代码从我的 DEV 服务器移动到我的 PROD 服务器之前,我并不关心这个问题。

在我的 DEV 环境中,查询需要 3 分 26 秒才能完成执行。然而,在 PROD 上,完全相同的代码需要 15 分钟:34 秒才能完成。

这些时间是在以下代码执行中添加日志检索的:

private List<Map<String, String>> getFieldInformation(ResultSet sqlResult) throws SQLException {


    //Map between each column name and the designated data as String
    List<Map<String, String>> rows = new ArrayList<Map<String,String>>();

    // Count number of returned records
    ResultSetMetaData rsmd = sqlResult.getMetaData();
    int numberOfColumns = rsmd.getColumnCount();

    boolean continueLoop = sqlResult.next();

    // If there are no results we return an empty list not null
    if(!continueLoop) {
        return rows;
    }
    while (continueLoop) {
        Map<String, String> columns = new LinkedHashMap<String, String>();

        // Reset Variables for data
        String columnLabel = null;
        String dataInformation = null;

        // Append to the map column name and related data
        for(int i = 1; i <= numberOfColumns; i++) {

            columnLabel = rsmd.getColumnLabel(i);
            dataInformation = sqlResult.getString(i);

            if(columnLabel!=null && columnLabel.length()>0 && (dataInformation==null || dataInformation.length() <= 0 )) {
                dataInformation = "";
            }
            columns.put(columnLabel, dataInformation);
        }
        rows.add(columns);
        continueLoop = sqlResult.next();
    }
    return rows;
}

我知道“getString”不是检索非 TEXT 数据的最佳方式,但由于项目的性质,我并不总是知道数据类型。

此外,我在任务管理器下检查了 PROD,“内存(私有工作集)”的保留速度非常慢。

因此,如果您能帮助解决以下问题,我将不胜感激:

  1. 为什么两种环境的执行时间存在差异?您能否强调一些检查此问题的方法?
  2. 有没有办法我可以看到我的结果集所需的内存并预先保留相同的内存?这会对性能有一些改进吗?
  3. 如何提高 getString(i) 方法的性能?

预先感谢您的协助。

最好的问候,齐扎

4

0 回答 0