2017-11-16 5 views
1

TLを使用している間、DRApacheのドリル「リミット0」クエリ春データソース

私はファイルシステムに保存された寄木細工のファイルを利用した春のブートアプリケーションを持っています。それらにアクセスするには、Apache Drillを使用しています。

私はそれらにアクセスする可能性がある複数のユーザーがいるため、私は春に接続プールを設定しました。

接続プールを使用しているときに、実際のクエリを実行する前に何らかの方法で「制限0」クエリを実行すると、パフォーマンスに影響があります。直接のConnectionから取得した簡単なステートメントでクエリを実行すると、同じ "limit 0"クエリは実行されません。

これは、Spring JdbcTemplateが単純なステートメントの代わりにPreparedStatementsを使用するという事実に関連しているようです。

「制限0」のクエリを削除する方法はありますか?

- - 詳細 Spring構成クラスの

接続プールは、次のようになります。

@Bean 
@ConfigurationProperties(prefix = "datasource.parquet") 
@Qualifier("parquetDataSource") 
public DataSource parquetDataSource() { 
    return DataSourceBuilder.create().build(); 
} 

開発プロファイルYMLファイル内の対応するプロパティは次のとおりです。

datasource: 
    parquet: 
    url: jdbc:drill:drillbit=localhost:31010 
    jdbcUrl: jdbc:drill:drillbit=localhost:31010 
    jndiName: jdbc/app_parquet 
    driverClassName: org.apache.drill.jdbc.Driver 
    maximumPoolSize: 5 
    initialSize: 1 
    maxIdle: 10 
    maxActive: 20 
    validation-query: SELECT 1 FROM sys.version 
    test-on-borrow: true 

前述のDrill DataSourceで作成されたJdbcTemplateを使用してクエリを実行すると、3つの異なるqクエリが実行される可能性があります。

  1. 検証クエリSELECT 1 FROM sys.version;
  2. SELECT * FROM (<my actual query>) LIMIT 0のような "制限0"クエリ。
  3. 私の実際のクエリ。

ここで実行コードは(parquetJdbcTemplateがorg.springframework.jdbc.core.JdbcTemplateを拡張するクラスのインスタンスである)です。

parquetJdbcTemplate.query(sqlQuery, namedParameters, 
      resultSet -> { 
       MyResultSet result = new MyResultSet(); 
       while (resultSet.next()) { 
        // populate the "result" object 
       } 
       return result; 
      }); 

は、ここに私のドリルモニタのプロフィールページからのスクリーンショットです: monitor screenshot

下のクエリは「制限0」の1つで、真ん中には検証クエリがあり、上に(クエリが表示されていなくても)必要なデータを返す実際のクエリがあります。

"limit 0"クエリの実行には、実行時間全体の1/3以上が必要です。実行時間が無視できるため、接続を確認する必要があるため、検証クエリは問題ありません。

public void executeQuery(String myQuery) { 
    Class.forName("org.apache.drill.jdbc.Driver"); 
    Driver.load(); 
    Connection connection = DriverManager.getConnection("jdbc:drill:drillbit=localhost:31010"); 
    Statement st = connection.createStatement(); 
    ResultSet resultSet = st.executeQuery(myQuery); 
    while (resultSet.next()) { 
     // do stuff 
    } 
} 

monitor screenshot として:私はドリルドライバを介して接続を使用して、同じクエリを実行すると、

事実は(したがって、ノープール付き)、私は唯一のUIモニターの私の実際のクエリを参照してください、です「制限0」のクエリが実行されないため、合計実行時間が大幅に向上します(〜26秒ではなく〜14秒)。

私が知る限り、これらの「制限0」のクエリは、寄木張りファイルの基礎となるスキーマに関する情報を検証して取得するために実行されます。接続プールの使用中にそれらを無効にする方法はありますか?理想的には、PreparedStatementsを単純な文よりも使いたいと思っていますが、必要に応じて単純な文に切り替えることができます。これらの問合せを完全に制御できるため(誰かがデプロイした成果物をハックしない限りSQL注入はできません)。

答えて

1

あなたは正しいです。ドリルは、事前準備されたステートメントを制限0で実行して、スキーマに関する情報を取得します。私はそのような行動を無効にする方法はないと思います。デフォルトではfalseであるplanner.enable_limit0_optimizationオプションを有効にすることをお勧めできますが、クエリの実行制限が0になる可能性があります。 0クエリを制限するもう1つの方法は、ビューの使用方法を介してキャストを使用してスキーマを明示的に指定することです。

質問を表示しないことについては、これは最新のドリルバージョンで修正されたと思います。

+0

お返事ありがとうございます。残念ながら、私は 'planner.enable_limit0_optimization'を' true'に設定し、 'cast'関数でビューを使用していました。全体的なパフォーマンスは少し向上しましたが、余分な "0制限"クエリが実行されたため、依然として受け入れられません。 クエリが表示されないので、私はドリルバージョンを更新します。 – javatutorial

関連する問題