Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.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
Oracle 选择每个表中的行数的快速查询_Oracle - Fatal编程技术网

Oracle 选择每个表中的行数的快速查询

Oracle 选择每个表中的行数的快速查询,oracle,Oracle,我需要一个选择每个表中的行数的查询 但这些数据并未在统计上更新。因此,此类查询将不准确: 从用户表格中选择表格名称、行数 我想选择几个模式,每个模式至少有500个表,其中一些包含很多列。如果我想更新它们,我需要几天的时间 从网站上,他建议一个功能包括这个查询 '选择计数(*) 从“| | p| tname”到l|u column value 这种带有count(*)的查询速度非常慢,而且不会给我快速的结果。 是否有一个查询可以快速给出表中有多少行?您可以创建一个表来保存每个表的计数。然后,为正在

我需要一个选择每个表中的行数的查询 但这些数据并未在统计上更新。因此,此类查询将不准确:

从用户表格中选择表格名称、行数

我想选择几个模式,每个模式至少有500个表,其中一些包含很多列。如果我想更新它们,我需要几天的时间

从网站上,他建议一个功能包括这个查询

'选择计数(*) 从“| | p| tname”到l|u column value

这种带有count(*)的查询速度非常慢,而且不会给我快速的结果。

是否有一个查询可以快速给出表中有多少行?

您可以创建一个表来保存每个表的计数。然后,为正在计数的每个表设置一个在INSERT上运行的触发器,以更新主表


您还需要包含一个删除触发器。

您可以创建一个表来保存每个表的计数。然后,为正在计数的每个表设置一个在INSERT上运行的触发器,以更新主表

您还需要包含一个删除触发器。

完全公开:我最初建议使用一个查询,专门计算(a)索引和(b)非空的列@AlexPoole和@JustinCave指出(请参见下面的评论),Oracle将优化
COUNT(*)
来实现这一点。因此,这一答案已发生了重大变化


有一个很好的解释说明了为什么
User\u Tables
不应该用于精确的行计数,即使统计数据是最新的

如果表中的索引可以通过索引扫描而不是表扫描来加速计数,Oracle将使用它们。这将使计数更快,但决不是瞬时的。这就是说,这是我知道的唯一获得准确计数的方法

要检查空(零行)表,请使用Alex Poole发布的答案。

完全公开:我最初建议使用一个查询,专门计算(a)索引和(b)非空的列@AlexPoole和@JustinCave指出(请参见下面的评论),Oracle将优化
COUNT(*)
来实现这一点。因此,这一答案已发生了重大变化


有一个很好的解释说明了为什么
User\u Tables
不应该用于精确的行计数,即使统计数据是最新的

如果表中的索引可以通过索引扫描而不是表扫描来加速计数,Oracle将使用它们。这将使计数更快,但决不是瞬时的。这就是说,这是我知道的唯一获得准确计数的方法


要检查空(零行)表,请使用Alex Poole发布的答案。

您在评论中说要删除(删除?)空表。如果不需要精确计数,而只想知道表是否为空,则可以执行快捷方式计数:

select count(*) from table_name where rownum < 2;

如果其中一个表有任何行,则返回一,如果两个表都为空,则只返回零。

您在评论中说要删除(删除?)空表。如果不需要精确计数,而只想知道表是否为空,则可以执行快捷方式计数:

select count(*) from table_name where rownum < 2;

如果任何一个表有任何行,则任何一个都将返回一个,如果它们都是空的,则只返回零。

根据您提供的限制和要求,我不得不说不。如果这个系统被成千上万的人使用,并且每个人都在更新各种模式中的数据,那么没有一个表包含这些信息,除非您创建一个视图/表,但在填充它的第二天,它可能已经过时了。Ref:我敢问,为什么在任何给定的时间,您需要任何/所有表中的即时+精确行数?合理更新的统计数据应该会给你一个合理(如果不准确的话)的答案,不?xqbert谢谢你的评论@tbone我想删除空表,所以我必须对结果保持准确,以确保不会删除错误的表。计算所有表中的行或多或少是oracle在收集统计数据时所做的事情。所以,如果你已经把所有的东西都数到1。你不想保存统计数据吗?二,。您不认为oracle做得更快吗?您想在删除所有行之前对任何/所有表进行精确计数,以便确保oracle正确删除了所有行???简单得多:截断表x;而不是:从x中选择计数(1);从x中删除;(确保计数匹配);犯罪根据您提供的限制和要求,我不得不说不。如果这个系统被成千上万的人使用,并且每个人都在更新各种模式中的数据,那么没有一个表包含这些信息,除非您创建一个视图/表,但一旦填充它,它可能就过时了。Ref:我敢问,为什么在任何给定的时间,您需要任何/所有表中的即时+精确行数?合理更新的统计数据应该会给你一个合理(如果不准确的话)的答案,不?xqbert谢谢你的评论@tbone我想删除空表,所以我必须对结果保持准确,以确保不会删除错误的表。计算所有表中的行或多或少是oracle在收集统计数据时所做的事情。所以,如果你已经把所有的东西都数到1。你不想保存统计数据吗?二,。您不认为oracle做得更快吗?您想在删除所有行之前对任何/所有表进行精确计数,以便确保oracle正确删除了所有行???简单得多:截断表x;而不是:从x中选择计数(1);从x中删除;(确保计数匹配);犯罪当然,请注意,这需要对表上的每个
INSERT
DELETE
操作进行序列化。这将极大地影响系统的可扩展性
select greatest(
    (select count(*) from schema1.table_name where rownum < 2),
    (select count(*) from schema2.table_name where rownum < 2)
) from dual;