计算连接查询行数的最快方法

Posted

技术标签:

【中文标题】计算连接查询行数的最快方法【英文标题】:Most speed way to count rows of a join query 【发布时间】:2019-04-24 12:10:54 【问题描述】:

我想在java中通过mysql jdbc执行以下查询:SELECT COUNT (*) FROM ORDERS, CUSTOMER WHERE O_ORDEYKEY = O_CUSTKEY

我有这个代码:

Connection conn = new DatabaseConnection().createMySQLConnection();
int totalRows=0;
  for(int j=0;j<tables.size();j++)
        
            Statement stmt = null;
            ResultSet rs = null;
            int rowCount = -1;
            try 
                conn.setAutoCommit(false);
                stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
                rs = stmt.executeQuery("SELECT COUNT(*) FROM " + tables.get(j) 
 + " WHERE O_ORDERKEY = O_CUSTKEY;");
                rs.next();
                rowCount = rs.getInt(1);
                totalRows= totalRows+rowCount;
             finally 
                rs.close();
                stmt.close();
            

        

但我想更快地运行它。我该怎么做?

【问题讨论】:

我认为您在其中缺少" 添加到 @RiggsFolly 的评论 java 至少支持 JDK 8 中的 prepared statements 以防止 SQL 注入,我建议您使用它们 “但我想更快地运行它。我该怎么做?”索引很可能会有所帮助。 This 可能会有所帮助 - 将相同的概念应用于您的特定数据库。 要添加到@RaymondNijland 评论 SQL 一直以来都有 JOIN 语法,您也将从学习中受益 【参考方案1】:

为了便于阅读,您应该避免使用基于 where 的旧隐式连接语法,并使用 SQL 标准(自 1992 年以来)显式连接语法:

SELECT COUNT (*) 
FROM ORDERS
INNER JOIN CUSTOMER  ON  ORDERS.O_ORDEYKEY = CUSTOMER.O_CUSTKEY

为了获得更好的性能,请确保您有一个索引:

表 ORDERS 列 O_ORDEYKEY

表 CUSTOMER 列 O_CUSTKEY

【讨论】:

@programmer 新的 JOIN 语法也比 ansi 逗号连接语法更好,因为使用旧的 ansi 逗号连接语法,您只能进行内部连接或交叉连接。较新的连接 SQL 标准语法还定义了左连接和右连接(并非所有数据库都支持右连接),这意味着您有更多的选项具有更好的可读性

以上是关于计算连接查询行数的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

为啥我计算行数的原始查询总是返回 -1?

计算带有子查询的行数的比率

计算 Redshift 表中存在的重复行数的更快方法是啥

Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法

mysql 表关联

选择没有连接数据的事件的最快方法