Oracle查询优化实践
在处理组织架构树形展示时,原始代码使用了两次SQL查询,并通过Java代码进行数据组装。这种做法不仅增加了数据库访问次数,也提高了程序复杂度。
以下是优化前的实现方式:
public List<TdDepartment> createZtreeDep(String compId) {
List<TdDepartment> result = new ArrayList<TdDepartment>();
String childSql = "select dep_id,dep_name,super_id,folder from td_department " +
"start with super_id in ( " +
"select dep_id from td_department " +
"where valid_flag = 'Y' and comp_id = '"+compId+"') connect by prior dep_id = super_id";
String parentSql = "select dep_id ,dep_name,super_id,folder from td_department " +
"where valid_flag = 'Y' and comp_id = '"+compId+"'";
EpDB db = new EpDB();
ArrayList<HashMap> parentDepts = db.getHashData(parentSql);
ArrayList<HashMap> childDepts = db.getHashData(childSql);
if(parentDepts == null || parentDepts.size() <= 0)
return null;
for(int i=0; i<parentDepts.size(); i++){
String id = parentDepts.get(i).get("DEP_ID").toString();
String name = parentDepts.get(i).get("DEP_NAME").toString();
String pid = parentDepts.get(i).get("SUPER_ID").toString();
TdDepartment dept = new TdDepartment();
dept.setId(id);
dept.setPid(pid);
dept.setName(name);
if(parentDepts.get(i).get("FOLDER") != null){
String folder = parentDepts.get(i).get("FOLDER").toString();
if("Y".equals(folder)){
dept.setOpen("true");
}else{
dept.setOpen("false");
}
}
result.add(dept);
}
for(int i=0; i<childDepts.size(); i++){
String id = childDepts.get(i).get("DEP_ID").toString();
String name = childDepts.get(i).get("DEP_NAME").toString();
String pid = childDepts.get(i).get("SUPER_ID").toString();
TdDepartment dept = new TdDepartment();
dept.setId(id);
dept.setPid(pid);
dept.setName(name);
if(childDepts.get(i).get("FOLDER") != null){
String folder = childDepts.get(i).get("FOLDER").toString();
if("Y".equals(folder)){
dept.setOpen("true");
}else{
dept.setOpen("false");
}
}
result.add(dept);
}
return result;
}
经过分析发现,可以合并两个查询为一个层级查询语句,从而减少数据库访问次数并简化逻辑。
优化后的代码如下:
public List<TdDepartment> createZtreeDep(String compId) {
List<TdDepartment> result = new ArrayList<TdDepartment>();
String sql = "select dep_id,dep_name,super_id,folder from td_department " +
"start with dep_id in ( " +
"select dep_id from td_department " +
"where valid_flag = 'Y' and comp_id = '"+compId+"') connect by super_id = prior dep_id";
System.out.println("sql=" + sql);
EpDB db = new EpDB();
ArrayList<HashMap> departments = db.getHashData(sql);
if(departments == null || departments.size() <= 0)
return null;
for(int i=0; i<departments.size(); i++){
String id = departments.get(i).get("DEP_ID").toString();
String name = departments.get(i).get("DEP_NAME").toString();
String pid = departments.get(i).get("SUPER_ID").toString();
TdDepartment dept = new TdDepartment();
dept.setId(id);
dept.setPid(pid);
dept.setName(name);
if(departments.get(i).get("FOLDER") != null){
String folder = departments.get(i).get("FOLDER").toString();
if("Y".equals(folder)){
dept.setOpen("true");
}else{
dept.setOpen("false");
}
}
result.add(dept);
}
return result;
}
主要改进点包括:
- 将原本两次数据库查询合并为一次
- 简化了Java代码逻辑结构
- 避免重复遍历和对象创建