Skip to content

Commit

Permalink
Metadata queries improvment (#1694)
Browse files Browse the repository at this point in the history
* Metadata queries improvements.
When dealing with large PostrgeSQL databases of thousands of schemas, tens of thousands of tables and millions of indexes particular PgDatabaseMetaData methods have suboptimal implementation.
The pattern that was utilized in implementation used inner query on pg_catalog.pg_index in order to retrieve keys (information_schema._pg_expandarray(i.indkey) AS keys). Such implementation forced full table scan on pg_catalog.pg_index prior to filtering result set on schema and table name.
The optimization idea was to get rid of inner querry in order to let querry planner to avoid full table scan and filter out pg_catalog.pg_index rows prior to executing (information_schema._pg_expandarray(i.indkey) AS keys).

* Add test for column order.
  • Loading branch information
bjanczak committed Feb 4, 2020
1 parent d8adfa5 commit ad8232d
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 0 deletions.
Expand Up @@ -2424,6 +2424,7 @@ public ResultSet getIndexInfo(String catalog, String schema, String tableName,
}

sql = "SELECT "
+ " tmp.TABLE_CAT, "
+ " tmp.TABLE_SCHEM, "
+ " tmp.TABLE_NAME, "
+ " tmp.NON_UNIQUE, "
Expand Down
Expand Up @@ -658,6 +658,32 @@ public void testIndexInfo() throws SQLException {
rs.close();
}

/**
* Order defined at
* https://docs.oracle.com/javase/8/docs/api/java/sql/DatabaseMetaData.html#getIndexInfo-java.lang.String-java.lang.String-java.lang.String-boolean-boolean-
*/
@Test
public void testIndexInfoColumnOrder() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
assertNotNull(dbmd);
ResultSet rs = dbmd.getIndexInfo(null, null, "metadatatest", false, false);
assertEquals(rs.findColumn("TABLE_CAT"), 1);
assertEquals(rs.findColumn("TABLE_SCHEM"), 2);
assertEquals(rs.findColumn("TABLE_NAME"), 3);
assertEquals(rs.findColumn("NON_UNIQUE"), 4);
assertEquals(rs.findColumn("INDEX_QUALIFIER"), 5);
assertEquals(rs.findColumn("INDEX_NAME"), 6);
assertEquals(rs.findColumn("TYPE"), 7);
assertEquals(rs.findColumn("ORDINAL_POSITION"), 8);
assertEquals(rs.findColumn("COLUMN_NAME"), 9);
assertEquals(rs.findColumn("ASC_OR_DESC"), 10);
assertEquals(rs.findColumn("CARDINALITY"), 11);
assertEquals(rs.findColumn("PAGES"), 12);
assertEquals(rs.findColumn("FILTER_CONDITION"), 13);

rs.close();
}

@Test
public void testNotNullDomainColumn() throws SQLException {
DatabaseMetaData dbmd = con.getMetaData();
Expand Down

0 comments on commit ad8232d

Please sign in to comment.