[ https://issues.apache.org/jira/browse/PHOENIX-4712?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16459885#comment-16459885 ]
James Taylor commented on PHOENIX-4712: --------------------------------------- I see what's going on. We're trying to be a bit too smart in keeping the client-side cache up-to-date when changes are made (rather than invalidating and letting the modified table metadata be pulled over from the server). For example, the following tweak to your test passes (when a different connection is used to execute the query). Rather than traversing the entire cache to remove all views, it might be better to just invalidate the parent on the client-side (i.e. remove it from the cache) when an index is added to it. {code:java} @Test public void testQueryForViewOnTableThatHasIndex() throws SQLException { try (Connection conn = DriverManager.getConnection(getUrl()); Connection conn2 = DriverManager.getConnection(getUrl()); Statement s = conn.createStatement(); Statement s2 = conn2.createStatement()) { String tableName = generateUniqueName(); String viewName = generateUniqueName(); String indexName = generateUniqueName(); // Create a table s.execute("create table " + tableName + " (col1 varchar primary key, col2 varchar)"); // Create a view on the table s.execute("create view " + viewName + " (col3 varchar) as select * from " + tableName); // Create a index on the table s.execute("create index " + indexName + " ON " + tableName + " (col2)"); try (ResultSet rs = s2.executeQuery("explain select /*+ INDEX(" + viewName + " " + indexName + ") */ * from " + viewName + " where col2 = 'aaa'")) { String explainPlan = QueryUtil.getExplainPlan(rs); // check if the query uses the index assertTrue(explainPlan.contains(indexName)); } } } {code} > When creating an index on a table, meta data cache of views related to the > table isn't updated > ---------------------------------------------------------------------------------------------- > > Key: PHOENIX-4712 > URL: https://issues.apache.org/jira/browse/PHOENIX-4712 > Project: Phoenix > Issue Type: Bug > Reporter: Toshihiro Suzuki > Assignee: Toshihiro Suzuki > Priority: Major > Attachments: PHOENIX-4712-v2.patch, PHOENIX-4712.patch > > > Steps to reproduce are as follows: > 1. Create a table > {code} > create table tbl (col1 varchar primary key, col2 varchar); > {code} > 2. Create a view on the table > {code} > create view vw (col3 varchar) as select * from tbl; > {code} > 3. Create a index on the table > {code} > create index idx ON tbl (col2); > {code} > After those, when issuing a explain query like the following, it seems like > the query doesn't use the index, although the index should be used: > {code} > 0: jdbc:phoenix:> explain select /*+ INDEX(vw idx) */ * from vw where col2 = > 'aaa'; > +---------------------------------------------------------------+ > | PLAN | > +---------------------------------------------------------------+ > | CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN FULL SCAN OVER TBL | > | SERVER FILTER BY COL2 = 'aaa' | > +---------------------------------------------------------------+ > {code} > However, after restarting sqlline, the explain output is changed, and the > index is used. > {code} > 0: jdbc:phoenix:> explain select /*+ INDEX(vw idx) */ * from vw where col2 = > 'aaa'; > +--------------------------------------------------------------------------------+ > | PLAN > | > +--------------------------------------------------------------------------------+ > | CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN FULL SCAN OVER TBL > | > | SKIP-SCAN-JOIN TABLE 0 > | > | CLIENT 1-CHUNK PARALLEL 1-WAY ROUND ROBIN RANGE SCAN OVER IDX > ['aaa'] | > | SERVER FILTER BY FIRST KEY ONLY > | > | DYNAMIC SERVER FILTER BY "VW.COL1" IN ($3.$5) > | > +--------------------------------------------------------------------------------+ > {code} > I think when creating an index on a table, meta data cache of views related > to the table isn't updated, so the index isn't used for that query. However > after restarting sqlline, the meta data cache is refreshed, so the index is > used. > When creating an index on a table, we should update meta data cache of views > related to the table. -- This message was sent by Atlassian JIRA (v7.6.3#76005)