【发布时间】:2018-10-25 22:34:13
【问题描述】:
JDBC 是否支持检索表和列统计信息(如 NUM_DISTINCT),还是我必须直接访问每个数据库供应商的统计信息表? (例如,对于 Oracle, "select column_name, num_distinct, density from dba_tab_col_statistics where table_name='myTable'")
【问题讨论】:
标签: jdbc statistics
JDBC 是否支持检索表和列统计信息(如 NUM_DISTINCT),还是我必须直接访问每个数据库供应商的统计信息表? (例如,对于 Oracle, "select column_name, num_distinct, density from dba_tab_col_statistics where table_name='myTable'")
【问题讨论】:
标签: jdbc statistics
JDBC 与数据库无关,在统计数据方面没有定义太多。当前在 JDBC 中定义的唯一类型的表相关统计信息是 DatabaseMetaData.getIndexInfo 的一部分,它们在很大程度上是可选的。我不确定哪些驱动程序实现了它,以及在多大程度上实现了它。
见DatabaseMetaData.getIndexInfo,专供TYPEtableIndexStatistic:
CARDINALITYlong=> 当TYPE为tableIndexStatistic时,则这是表中的行数;否则,它是数字 索引中的唯一值。PAGESlong=> 当TYPE是tableIndexStatistic那么这是表格使用的页数,否则是页数 用于当前索引的页面数。
即使您的数据库驱动程序支持tableIndexStatistic,您最好还是使用数据库特定的功能来获取统计信息,因为它们更有可能被记录在案,有更广泛的选择,而且有更多的人知道含义和解释。
虽然我是 JDBC 专家组的成员,但我不知道这种缺席的历史原因(或者在我加入之前是否曾经出现过),但如果我必须进行理论化,我认为这可能是因为数据库之间统计数据的类型和可用性差异很大。
这种多样性使得标准化仍然对双方都可用的 API 变得困难(几乎没有统计数据和各种各样的统计数据)。没有什么比拥有一个广泛的(也许是复杂的)API 更令人沮丧的了,因为您的数据库不支持它,所以什么也得不到。类似地,拥有一个包含大量统计信息的数据库可能会非常令人沮丧,但您无法访问其中的一些数据,因为它不符合标准 API。
【讨论】: