Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLite联合表和计数(*)的有效方法_Sql_Sqlite - Fatal编程技术网

SQLite联合表和计数(*)的有效方法

SQLite联合表和计数(*)的有效方法,sql,sqlite,Sql,Sqlite,我想使用where子句计算两个表include的行数。我已经找到了解决办法,但不知道这是否是最好的办法。where子句是动态生成的,最多可过滤5列。该表有10列,最多可以有数百万条记录 select count(*) from ( select * from pending {whereClause} union all select * from history {whereClause} ) 由于数据量大,联盟的成本相当高。您可能会发现单独进行计数要快一点: select p.cnt

我想使用where子句计算两个表include的行数。我已经找到了解决办法,但不知道这是否是最好的办法。where子句是动态生成的,最多可过滤5列。该表有10列,最多可以有数百万条记录

select count(*) from 
(
select * from pending {whereClause} 
union all
select * from history {whereClause}
)
由于数据量大,联盟的成本相当高。您可能会发现单独进行计数要快一点:

select p.cnt + h.cnt
from (select count(*) as cnt from pending {whereClause}) p cross join
     (select count(*) as cnt from history {whereClause}) h;

此外,这打开了查询仅为每个子查询使用索引的可能性。这可能是一个更显著的性能提升。

由于表可以有不同的索引,并且您可以应用差异WHERE子句,因此您的解决方案是完全有效的

由于在检查不同集合的签名时会有开销,因此您可以更快地分别获得这两个计数,然后将它们相加

SELECT
  (select COUNT(*) from pending {whereClause})
  +
  (select COUNT(*) from history {whereClause})

谢谢你的解决方案!如果您需要知道每个表的结果,这是一个好方法!