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クエリが実行される可能性があります。
- 検証クエリ
SELECT 1 FROM sys.version
; SELECT * FROM (<my actual query>) LIMIT 0
のような "制限0"クエリ。- 私の実際のクエリ。
ここで実行コードは(parquetJdbcTemplateがorg.springframework.jdbc.core.JdbcTemplateを拡張するクラスのインスタンスである)です。
parquetJdbcTemplate.query(sqlQuery, namedParameters,
resultSet -> {
MyResultSet result = new MyResultSet();
while (resultSet.next()) {
// populate the "result" object
}
return result;
});
は、ここに私のドリルモニタのプロフィールページからのスクリーンショットです:
下のクエリは「制限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
}
}
として:私はドリルドライバを介して接続を使用して、同じクエリを実行すると、
事実は(したがって、ノープール付き)、私は唯一のUIモニターの私の実際のクエリを参照してください、です「制限0」のクエリが実行されないため、合計実行時間が大幅に向上します(〜26秒ではなく〜14秒)。
私が知る限り、これらの「制限0」のクエリは、寄木張りファイルの基礎となるスキーマに関する情報を検証して取得するために実行されます。接続プールの使用中にそれらを無効にする方法はありますか?理想的には、PreparedStatementsを単純な文よりも使いたいと思っていますが、必要に応じて単純な文に切り替えることができます。これらの問合せを完全に制御できるため(誰かがデプロイした成果物をハックしない限りSQL注入はできません)。
お返事ありがとうございます。残念ながら、私は 'planner.enable_limit0_optimization'を' true'に設定し、 'cast'関数でビューを使用していました。全体的なパフォーマンスは少し向上しましたが、余分な "0制限"クエリが実行されたため、依然として受け入れられません。 クエリが表示されないので、私はドリルバージョンを更新します。 – javatutorial