You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "wudejin (Jira)" <ji...@apache.org> on 2020/12/16 06:42:00 UTC

[jira] [Created] (CALCITE-4439) how to avoid query database column meta when I execute select query

wudejin created CALCITE-4439:
--------------------------------

             Summary: how to avoid query database column meta when I execute select query
                 Key: CALCITE-4439
                 URL: https://issues.apache.org/jira/browse/CALCITE-4439
             Project: Calcite
          Issue Type: Improvement
          Components: core
    Affects Versions: 1.21.0
            Reporter: wudejin


 I use calcite jdbc to query greenplum, code as follow:
{code:java}
Class.forName("org.apache.calcite.jdbc.Driver");
Properties info = new Properties();
info.setProperty("lex", "JAVA");
Connection connection =
        DriverManager.getConnection("jdbc:calcite:", info);
CalciteConnection calciteConnection =
        connection.unwrap(CalciteConnection.class);
SchemaPlus rootSchema = calciteConnection.getRootSchema();
Class.forName("com.mysql.cj.jdbc.Driver");
BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:postgresql://192.168.125.3:5432/sit_cicada_0819");
dataSource.setUsername(USER);
dataSource.setPassword(PASSWORD);
Schema schema = JdbcSchema.create(rootSchema, "cicada", dataSource, null, null);
rootSchema.add("cicada", schema);
calciteConnection.setSchema("cicada");
Statement statement = calciteConnection.createStatement();
ResultSet resultSet = statement.executeQuery("select zqsl, y_w, sspcs from t_rh_aj_zq_jtj where ssfj='WQFJ' and n_w = '2020'");
print(resultSet);
resultSet.close();
statement.close();
connection.close();
{code}
this query cost 20 seconds, but i use navicat to run above sql only took 0.041 s.
 
I use arthas to analysis the code consumed time:
{code:java}
[arthas@35681]$ trace --skipJDKMethod false -n 1 org.apache.calcite.sql.validate.SqlValidatorImpl validateNamespace
Press Q or Ctrl+C to abort.
        Affect(class count: 2 , method count: 1) cost in 471 ms, listenerId: 16
        `---ts=2020-12-14 17:33:21;thread_name=http-nio-8888-exec-3;id=59;is_daemon=true;priority=5;TCCL=com.code.plugin.loader.PluginClassLoader@2e7620e1
`---[14841.944034ms] org.apache.calcite.sql.validate.SqlValidatorImpl:validateNamespace()
    +---[14841.716027ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:validate() #1005
        |   `---[14831.796817ms] org.apache.calcite.sql.validate.SqlValidatorImpl:validateNamespace()
    |       +---[14831.624599ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:validate() #1005
        |       |   `---[0.458664ms] org.apache.calcite.sql.validate.SqlValidatorImpl:validateNamespace()
    |       |       +---[0.176725ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:validate() #1005
        |       |       `---[0.012963ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1006
        |       +---[0.006568ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1006
        |       +---[0.011847ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1007
        |       +---[0.029899ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getType() #57
        |       `---[0.04292ms] org.apache.calcite.sql.validate.SqlValidatorImpl:setValidatedNodeType() #57
        +---[0.011767ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1006
        +---[0.009111ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1007
        +---[0.030568ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getType() #57
        `---[0.014533ms] org.apache.calcite.sql.validate.SqlValidatorImpl:setValidatedNodeType() #57

[arthas@35681]$ trace --skipJDKMethod false -n 1 org.apache.calcite.sql.validate.SqlValidatorImpl validateNamespace
Press Q or Ctrl+C to abort.
        Affect(class count: 2 , method count: 1) cost in 471 ms, listenerId: 16
        `---ts=2020-12-14 17:33:21;thread_name=http-nio-8888-exec-3;id=59;is_daemon=true;priority=5;TCCL=com.code.plugin.loader.PluginClassLoader@2e7620e1
`---[14841.944034ms] org.apache.calcite.sql.validate.SqlValidatorImpl:validateNamespace()
    +---[14841.716027ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:validate() #1005
        |   `---[14831.796817ms] org.apache.calcite.sql.validate.SqlValidatorImpl:validateNamespace()
    |       +---[14831.624599ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:validate() #1005
        |       |   `---[0.458664ms] org.apache.calcite.sql.validate.SqlValidatorImpl:validateNamespace()
    |       |       +---[0.176725ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:validate() #1005
        |       |       `---[0.012963ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1006
        |       +---[0.006568ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1006
        |       +---[0.011847ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1007
        |       +---[0.029899ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getType() #57
        |       `---[0.04292ms] org.apache.calcite.sql.validate.SqlValidatorImpl:setValidatedNodeType() #57
        +---[0.011767ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1006
        +---[0.009111ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getNode() #1007
        +---[0.030568ms] org.apache.calcite.sql.validate.SqlValidatorNamespace:getType() #57
        `---[0.014533ms] org.apache.calcite.sql.validate.SqlValidatorImpl:setValidatedNodeType() #57[arthas@35681]$ trace --skipJDKMethod false -n 1 org.apache.calcite.adapter.jdbc.JdbcSchema getRelDataType
Press Q or Ctrl+C to abort.
        Affect(class count: 1 , method count: 2) cost in 305 ms, listenerId: 30
        `---ts=2020-12-14 17:57:34;thread_name=http-nio-8888-exec-6;id=5c;is_daemon=true;priority=5;TCCL=com.code.plugin.loader.PluginClassLoader@2e7620e1
`---[17509.186064ms] org.apache.calcite.adapter.jdbc.JdbcSchema:getRelDataType()
    +---[0.379488ms] javax.sql.DataSource:getConnection() #360
        +---[0.019712ms] java.sql.Connection:getMetaData() #361
        +---[17506.071495ms] org.apache.calcite.adapter.jdbc.JdbcSchema:getRelDataType() #362
        |   `---[17506.003388ms] org.apache.calcite.adapter.jdbc.JdbcSchema:getRelDataType()
    |       +---[17503.628169ms] java.sql.DatabaseMetaData:getColumns() #371
        |       +---[0.022319ms] org.apache.calcite.sql.type.SqlTypeFactoryImpl:<init>() #376
        |       +---[0.018522ms] org.apache.calcite.rel.type.RelDataTypeFactory:builder() #378
        |       +---[min=0.003107ms,max=0.00738ms,total=0.062983ms,count=18] java.sql.ResultSet:next() #379
        |       +---[min=0.003663ms,max=0.00737ms,total=0.0689ms,count=17] java.sql.ResultSet:getString() #380
        |       +---[min=0.002867ms,max=0.018199ms,total=0.065724ms,count=17] java.sql.ResultSet:getInt() #381
        |       +---[min=0.003508ms,max=0.006388ms,total=0.064031ms,count=17] java.sql.ResultSet:getString() #382
        |       +---[min=0.004086ms,max=0.020781ms,total=0.089992ms,count=17] org.apache.calcite.avatica.SqlType:valueOf() #385
        |       +---[min=0.003254ms,max=0.013515ms,total=0.073793ms,count=17] org.apache.calcite.avatica.SqlType:ordinal() #57
        |       +---[min=0.002897ms,max=0.005934ms,total=0.048287ms,count=15] java.sql.ResultSet:getInt() #392
        |       +---[min=0.002859ms,max=0.005633ms,total=0.047827ms,count=15] java.sql.ResultSet:getInt() #393
        |       +---[min=0.007364ms,max=0.035082ms,total=0.16188ms,count=17] org.apache.calcite.adapter.jdbc.JdbcSchema:sqlType() #397
        |       +---[min=0.00291ms,max=0.018887ms,total=0.067839ms,count=17] java.sql.ResultSet:getInt() #398
        |       +---[min=0.005913ms,max=0.026077ms,total=0.123944ms,count=17] org.apache.calcite.rel.type.RelDataTypeFactory$Builder:add() #399
        |       +---[min=0.005282ms,max=0.019108ms,total=0.108095ms,count=17] org.apache.calcite.rel.type.RelDataTypeFactory$Builder:nullable() #57
        |       +---[min=0.00309ms,max=0.005495ms,total=0.008585ms,count=2] java.sql.ResultSet:getInt() #388
        |       +---[0.006726ms] java.sql.ResultSet:close() #401
        |       +---[0.03192ms] org.apache.calcite.rel.type.RelDataTypeFactory$Builder:build() #402
        |       `---[0.022148ms] org.apache.calcite.rel.type.RelDataTypeImpl:proto() #57
        `---[2.510182ms] org.apache.calcite.adapter.jdbc.JdbcSchema:close() #364
{code}
most of the time is spent on JdbcSchema.getRelDataType to getColumns,because my db contains five million columns.
Is there any way to solve this problem or avoid this column query?
 
Thanks!



--
This message was sent by Atlassian Jira
(v8.3.4#803005)