加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 与Firefox DB管理器相比,JDBC SELECT非常慢

发布时间:2020-12-15 02:33:00 所属栏目:Java 来源:网络整理
导读:解决了,当然在发布后,它击中了我…现在使用 http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC#Download不同的驱动程序,不需要大量配置. 休息下面的原始问题. 我正在使用包含OpenStreetMap数据的SQLite数据库,我在使用JDBC时遇到了一些麻烦. 下面的查询是
解决了,当然在发布后,它击中了我…现在使用 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();
stat.executeUpdate(订单上的“创建索引{index_name}”({column_name});“);
???stat.close();

创建索引:http://www.w3schools.com/sql/sql_create_index.asp

>插入需要更长的索引,因为每个先前的索引都需要在插入新记录时更新.在执行所有insert语句(性能更好)之后,最好先创建索引.索引列会影响插入性能,但选择性能会明显加快.
>更改JDBC驱动程序可能会有所帮助,但总体上不应该是潜在的问题.还要确保您以纯模式运行. Pure-java模式明显变慢,至少从我注意到的情况来看.假设您正在使用SQLite JDBC,以下代码段将告诉您正在运行的模式.

System.out.println(String.format(“%s mode”,SQLiteJDBCLoader.isNativeMode()?“native”:“pure-java”));

我在历史记录超过500K的数据库中选择速度慢,遇到了同样的问题.如果我没有编入索引,我的申请的运行时间将为9.9天.现在这是一个超快的2分钟做同样的事情.当使用正确和优化的sql时,SQLite非常快.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读