在单个查询中查找各种表中的总记录

Posted

技术标签:

【中文标题】在单个查询中查找各种表中的总记录【英文标题】:Find total records in various tables in a single query 【发布时间】:2016-03-28 16:59:10 【问题描述】:

目前我正在使用这个查询,是否有任何替代这个查询,这样会更快。

SELECT 
    SUM(result1),
    SUM(result2),
    SUM(result3)
FROM (
    (
        SELECT 
            0 as result1,0 as result2,COUNT(*) as result3
        FROM 
            table1
    )
    UNION
    (
        SELECT 
            count(*) as result1,0 as result2,0 as result3
        FROM 
         table2
    )
    UNION
    (
        SELECT 
            0 as result1,count(*) as result2,0 as result3
        FROM 
            table3
    )
    ) as allresult

【问题讨论】:

【参考方案1】:

上述查询的替代解决方案如下:

SELECT (SELECT COUNT(1) FROM table2) AS result1, 
       (SELECT COUNT(1) FROM table3) AS result2, 
       (SELECT COUNT(1) FROM table1) AS result3;

【讨论】:

两个查询将同时执行 感谢您的回答,但两个查询都需要相同的时间【参考方案2】:

WHERE clause 中添加表名并执行以下查询:

SELECT 
    T.Name AS TableName,
    S.Row_count AS RecordsCount
FROM 
    sys.dm_db_partition_stats S
INNER JOIN sys.tables T ON T.object_id = S.object_id
Where 
    Object_Name(S.Object_Id) IN ('Employees','Country')

【讨论】:

Givinig 错误:表 'sys.dm_db_partition_stats' 不存在。 @nitishkoundade,上述查询将在 MS SQL 环境中工作。你用的是什么数据库? 数据库是 mysql 5.5 @nitishkoundade,上述查询将在 MS SQL 环境中工作。我错过了 MySQL 标签。 要在 MySQL 中做这样的事情,它应该是SELECT table_rows FROM information_schema.tables WHERE table_schema = 'name_of_database' AND table_name IN ('table1', 'table2', 'table3')。不过,我不确定 MySQL 更新这些统计信息的频率。【参考方案3】:

从这个查询中减少一些性能负载的非常简单的方法:

使用 UNION ALL 代替 UNION。如果有任何重复项,则 UNION ALL 将返回重复项,但唯一的区别与您正在使用的方式(只是 UNION)是 UNION 以降低性能为代价删除这些重复项。换句话说,它会执行 UNION ALL,然后返回并删除重复的条目。

它应该会提高您的查询性能

【讨论】:

一般来说你是对的。但在这种情况下,只需要检查三行是否有重复项。【参考方案4】:

(从this answer复制我的评论)

您可以从INFORMATION_SCHEMA 获取表的行数,如下所示(但请参阅下面的警告):

SELECT table_rows 
FROM information_schema.tables
WHERE table_schema = DATABASE() 
AND table_name IN ('table1', 'table2', 'table3');

但是MySQL documentation 指出这些值对于 InnoDb 表精确:“对于 InnoDB 表,行数只是 SQL 优化中使用的粗略估计。(如果InnoDB 表已分区。)”。如果您使用的是 MyISAM,这种方法可能就足够了。

【讨论】:

以上是关于在单个查询中查找各种表中的总记录的主要内容,如果未能解决你的问题,请参考以下文章

如何在单个过程调用python中获取具有实际数据的总记录数?

MySQL查询表内重复记录

MySQL查询表内重复记录

Oracle 使用单个查询更新和更改两个表中的少量列记录

MySQL查询表内重复记录

Microsoft Access 中的选择查询在另一个表中查找返回错误结果的记录