JDBC是否有一种获取表和列统计信息的方法?

时间:2018-10-24 13:28:02

标签: jdbc statistics

JDBC是否支持检索表和列统计信息(例如NUM_DISTINCT),或者我是否必须直接访问每个数据库供应商的统计信息表? (例如,对于Oracle, “从dba_tab_col_statistics中选择column_name,num_distinct,密度,其中table_name ='myTable'”)

1 个答案:

答案 0 :(得分:1)

JDBC与数据库无关,并且在统计方面定义不多。当前在JDBC中定义的与表相关的统计信息的唯一类型是DatabaseMetaData.getIndexInfo的一部分,并且它们在很大程度上是可选的。我不确定哪个驱动程序可以实现它,在什么程度上实现它。

请参见DatabaseMetaData.getIndexInfo,专门针对TYPE tableIndexStatistic

  
      
  1. CARDINALITY long =>当TYPEtableIndexStatistic时,则为表中的行数;否则就是数字   索引中的唯一值。
  2.   
  3. PAGES long =>当TYPEtableIndexStatistic时,这是用于表的页数,否则为该数   当前索引使用的页面数。
  4.   

即使您的数据库驱动程序支持tableIndexStatistic,您也可能最好使用数据库特定的功能来获取统计信息,尽管由于它们更有可能被记录在案,因此具有更多的选择范围,并且越来越多的人意识到其含义和解释。

尽管我是JDBC专家组的成员,但我不知道这种缺席的历史原因(或者甚至在我加入之前就曾出现过这种情况),但是如果我必须进行理论化的话,我认为之所以可能是因为统计信息的类型和可用性在数据库之间存在很大差异。

这种多样性使得很难在仍然对双方都可用的API上进行标准化(几乎没有统计数据,并且各种各样的统计数据)。没有扩展的(也许是复杂的)API,没有什么比阻止它变得更令人沮丧的,因为您的数据库不支持它。同样,拥有大量统计信息的数据库可能会令人沮丧,但是您无法访问其中的一些统计信息,因为它不符合标准API。