是否可以使用ALL_TABLES查询表以获取计数-ORACLE

时间:2019-01-25 14:29:51

标签: oracle count

我需要一种更快的方法来对超过110亿行的大型表中的某些记录进行计数。 我在查询下面运行,它在1秒内获得11 +十亿行的计数

SELECT a.TABLE_NAME, to_char ( a.NUM_ROWS ), b.COLUMN_NAME
FROM ALL_TABLES a, ALL_TAB_COLUMNS b
WHERE a.table_name = 'OBJECT_TABLE' 
and a.TABLE_NAME = b.TABLE_NAME 
and b.owner = 'XX_ST'
and b.COLUMN_NAME = 'OBJECT_TYPE'

结果是这个OBJECT_TABLE 11042049900 OBJECT_TYPE

我想查询OBJECT_TABLE并仅获得某些OBJECT_TYPES而不是全部。 如果我这样运行查询,将花费很长时间

SELECT count (*)
FROM OBJECT_TABLE a
WHERE a.OBJECT_TYPE in ( 425, 989 ).

从该查询中,我期望11 + 10亿行中有100,000。

是否有一种方法可以使用ALL_TABLES a,ALL_TAB_COLUMNS b来使查询运行更快,从而仅获取某些行而不是某些表的全部行?

感谢您的帮助

1 个答案:

答案 0 :(得分:0)

您的要求在逻辑上是不可能的。获取实际计数的唯一方法是查询数据。如果使用企业版,则可能对计数查询应用并行性以提高其性能。否则,您将不得不使用某种类型的估计。在上述情况下,如果您只需要知道是否存在满足条件的行,则可以使用EXISTS子查询。 EXISTS在找到第一个匹配项时终止,通常比没有找到匹配项时必须运行完整的子查询要快得多。