Поддерживает ли JDBC получение статистики таблиц и столбцов (например, NUM_DISTINCT) или мне нужно напрямую обращаться к таблице статистики для каждого поставщика БД? (например, для Oracle "выберите column_name, num_distinct, плотность из dba_tab_col_statistics, где table_name = 'myTable'")
JDBC не зависит от базы данных и мало что определяет с точки зрения статистики. Единственный тип связанной с таблицами статистики, определенный в настоящее время в JDBC, - это часть DatabaseMetaData.getIndexInfo
, и в большинстве случаев они не являются обязательными. Я не уверен, какие драйверы это реализуют и в какой степени.
См. DatabaseMetaData.getIndexInfo
, особенно для TYPE
tableIndexStatistic
:
CARDINALITY
long
=> WhenTYPE
istableIndexStatistic
, then this is the number of rows in the table; otherwise, it is the number of unique values in the index.PAGES
long
=> WhenTYPE
istableIndexStatistic
then this is the number of pages used for the table, otherwise it is the number of pages used for the current index.
Даже если драйвер для вашей базы данных поддерживает tableIndexStatistic
, вам, вероятно, лучше использовать специальные функции базы данных для получения статистики, поскольку они с большей вероятностью будут задокументированы, имеют более широкий диапазон опций и больше людей знают о значении и интерпретация.
Хотя я являюсь членом экспертной группы JDBC, мне не известны исторические причины этого отсутствия (или если они когда-либо возникали до того, как я присоединился), но если бы мне пришлось теоретизировать, я думаю, что это, вероятно, потому что типы и доступность статистики сильно различаются между базами данных.
Такое разнообразие затрудняет стандартизацию API, который по-прежнему может использоваться обеими сторонами (практически нет статистики и большое разнообразие статистических данных). Нет ничего более разочаровывающего, чем иметь обширный (и, возможно, сложный) API, чтобы просто ничего не получить от него, потому что он не поддерживается для вашей базы данных. Точно так же может быть довольно неприятно иметь базу данных с большим количеством статистических данных, но вы не можете получить доступ к некоторым из них, потому что они просто не соответствуют стандартному API.