[ 
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)

Reply via email to