java – 与Firefox DB管理器相比,JDBC SELECT非常慢
解决了,当然在发布后,它击中了我…现在使用
http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC#Download不同的驱动程序,不需要大量配置.
休息下面的原始问题. 我正在使用包含OpenStreetMap数据的SQLite数据库,我在使用JDBC时遇到了一些麻烦. 下面的查询是我想用来获得一个靠近我的用户位置的位置(数字来自我的测试数据,并由java代码添加). SELECT roads.nodeID,lat,lon FROM roads INNER JOIN nodes ON roads.nodeID=nodes.nodeID ORDER BY (ABS(lat - (12.598418)) + ABS(lon - (-70.043514))) ASC LIMIT 1 ‘roads’和’nodes’都包含大约130,000行. 这个特定的查询是最密集的购买之一,它只使用了两次,所以应该可以满足我的需求.当使用Firefox SQLite时,它在大约281毫秒内执行,但在使用sqlitejdbc-v056的Java中,它需要12到14秒(具有完整的处理器负载). 关于如何解决这个问题的任何线索? public Node getNodeClosestToLocation(Location loc){ try { Class.forName("org.sqlite.JDBC"); Statement stat = conn.createStatement(); String q = "SELECT roads.nodeID,lon "+ "FROM roads "+ "INNER JOIN nodes "+ "ON roads.nodeID=nodes.nodeID "+ "ORDER BY (ABS(lat - ("+loc.getLat()+")) + ABS(lon - ("+loc.getLon()+"))) ASC "+ "LIMIT 1"; long start = System.currentTimeMillis(); System.out.println(q); rs = stat.executeQuery(q); if(rs.next()) { System.out.println("Done. " + (System.currentTimeMillis() - start)); return new Node(rs.getInt("nodeID"),rs.getFloat("lat"),rs.getFloat("lon")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return null; } 解决方法
当谈到JDBC中的select语句查询时,如果它们没有被正确使用,它们会非常缓慢.几点:
>确保索引表中正确的列.一个简单的行,如: Statement stat = connection.createStatement(); 创建索引:http://www.w3schools.com/sql/sql_create_index.asp >插入需要更长的索引,因为每个先前的索引都需要在插入新记录时更新.在执行所有insert语句(性能更好)之后,最好先创建索引.索引列会影响插入性能,但选择性能会明显加快. System.out.println(String.format(“%s mode”,SQLiteJDBCLoader.isNativeMode()?“native”:“pure-java”)); 我在历史记录超过500K的数据库中选择速度慢,遇到了同样的问题.如果我没有编入索引,我的申请的运行时间将为9.9天.现在这是一个超快的2分钟做同样的事情.当使用正确和优化的sql时,SQLite非常快. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |