Hologres は、サービングと分析を統合したリアルタイムデータウェアハウスです。SQL を使用して、数100億件を超えるレコードを持つ大規模なデータセットをサポートし、100万クエリ/秒 (QPS) を超える低レイテンシー (10 ms 未満) の Key/Value ポイントクエリサービスを提供します。このトピックでは、テーブルの作成やクエリ方法など、ポイントクエリシナリオのベストプラクティスについて説明します。
テーブルの作成
ポイントクエリシナリオ用にテーブルを作成する際は、次の点にご注意ください。
-
Key/Value ポイントクエリでキーとして使用されるフィールドをプライマリキーとして設定します。
-
プライマリキーがクラスタリングキーと一致することを確認します。
-
クエリ条件で使用される列を分散キーとして設定します。デフォルトでは、プライマリキーが分散キーになります。
-
テーブルの格納形式をローストアに設定します。
-
Hologres インスタンスに接続する際は、VPC ドメイン名を使用します。
-
TEXT、VARCHAR、または CHAR 型の列には、VARCHAR や CHAR の代わりに TEXT を使用します。
このようなテーブルを作成する例を次に示します。
-- test_kv_table という名前の行指向テーブルを作成し、key 列をプライマリキーとして設定します
begin;
create table test_kv_table(
key text primary key,
value text
);
call set_table_property('test_kv_table', 'orientation', 'row');
call set_table_property('test_kv_table', 'clustering_key', 'key');
call set_table_property('test_kv_table', 'distribution_key', 'key');
commit;
データのクエリ
テーブルにデータをインポートした後、ポイントクエリを実行できます。次のいずれかの方法を使用できます。
-
単一のキーのクエリ:
select * from test_kv_table where key = '1'; -
一度に複数のキーのクエリ:
select * from test_kv_table where key in ('1', '2', '3'); -
Java を使用したデータのクエリ
次の Java の例では、Key/Value クエリにプリペアドステートメントを使用しています。
説明-
VPC ドメイン名を使用して Hologres に接続します。
-
プリペアドステートメントを使用すると、クエリのパフォーマンスが向上します。
-
クエリごとに新しいプリペアドステートメントを作成するのではなく、再利用します。
// 1 から 100 までの値を持つ複数のキーをクエリします private static void testKV(Connection conn) throws Exception { String sql = "select * from test_kv_table where key = ?"; try (PreparedStatement stmt = conn.prepareStatement(sql)) { for (int i = 0; i < 100; ++i) { stmt.setString(1, Integer.toString(i)); long begin = System.currentTimeMillis(); try (ResultSet rs = stmt.executeQuery()) { long cost = System.currentTimeMillis() - begin; while(rs.next()) { System.out.println("data => " + rs.getObject(1).toString() + " " + rs.getObject(2).toString() + " latency => [" + cost + "]ms"); } } } } } -
-
HoloClient を使用したデータのクエリ
HoloClient は、複数のクエリを単一の SQL 文にマージすることで開発を簡素化します。次の例に示すように、Maven で公開されている最新バージョンを使用してください。
<dependency> <groupId>com.alibaba.hologres</groupId> <artifactId>holo-client</artifactId> <version>{1.2.16.5}</version> </dependency> // パラメーターを設定します。URL 形式は jdbc:postgresql://host:port/db です HoloConfig config = new HoloConfig(); config.setJdbcUrl(url); config.setUsername(username); config.setPassword(password); config.setReadThreadCount(10); // 読み取りの同時実行数。最大 10 個の JDBC 接続を使用します try (HoloClient client = new HoloClient(config)) { // create table t0(id int not null, name0 text, address text, primary key(id)) TableSchema schema0 = client.getTableSchema("t0"); Get get = Get.newBuilder(schema).setPrimaryKey("id", 0).build(); // where id=0; client.get(get).thenAcceptAsync((record)->{ // 結果取得後に何かを実行します }); Get get1 = Get.newBuilder(schema).setPrimaryKey("id", 1).build(); // where id=1; client.get(get1).thenAcceptAsync((record)->{ // 結果取得後に何かを実行します }); } catch(HoloClientException e){ }
Java の使用例
次の完全な Java の例は、`test_kv_table` という名前の行指向テーブルを作成し、`key` 列をプライマリキーとして使用し、複数のキーをクエリして結果を出力する方法を示しています。
package test;
import org.postgresql.jdbc.PgConnection;
import java.sql.*;
// test_kv_table という名前の行指向テーブルを作成し、key 列をプライマリキーとして設定します
public class TestPointQuery {
private static void init(Connection conn) throws Exception {
try (Statement stmt = conn.createStatement()) {
stmt.execute("drop table if exists test_kv_table;");
stmt.execute("begin;");
stmt.execute("create table if not exists test_kv_table(key text primary key, value text);");
stmt.execute("call set_table_property('test_kv_table', 'orientation', 'row');");
stmt.execute("call set_table_property('test_kv_table', 'shard_count', '20');");
stmt.execute("end;");
stmt.execute("insert into test_kv_table select i, i from generate_series(1, 10000)i");
}
}
// 1 から 100 までの値を持つ複数のキーをクエリします
private static void testKV(Connection conn) throws Exception {
String sql = "select * from test_kv_table where key = ?";
try (PreparedStatement stmt = conn.prepareStatement(sql)) {
for (int i = 0; i < 100; ++i) {
stmt.setString(1, Integer.toString(i));
long begin = System.currentTimeMillis();
try (ResultSet rs = stmt.executeQuery()) {
long cost = System.currentTimeMillis() - begin;
while(rs.next()) {
System.out.println("data => " + rs.getObject(1).toString() + " " + rs.getObject(2).toString() + " latency => [" + cost + "]ms");
}
}
}
}
}
// クエリ結果を出力します
public static void main(String[] args) throws Exception {
Class.forName("org.postgresql.Driver").newInstance();
String host = "";
String db = "";
String user = "";
String password = "";
String url = "jdbc:postgresql://" + host + "/" + db;
try (PgConnection conn = (PgConnection) DriverManager.getConnection(url, user, password)) {
System.out.println("init the test_kv_table for testing");
init(conn);
System.out.println("run test on test_kv_table");
testKV(conn);
}
}
}
パラメーターの説明:
-
host: ご利用の Hologres インスタンスのドメイン名です。このドメイン名は、Hologres コンソールのインスタンス詳細ページにある Network Information セクションで確認できます。
-
db: ご利用の Hologres インスタンスのデータベース名です。
-
user: ご利用の Alibaba Cloud アカウントの AccessKey ID です。この ID は AccessKey 管理 ページで取得できます。
-
password: ご利用の Alibaba Cloud アカウントの AccessKey Secret です。