1. テーブルのプレカット方法
プレカットテーブルは、カット値を指定することにより、事前に分割された各領域の分割点を参照することで、単一点の過熱の問題を効果的に回避します。
create table test
(id integer primary key,
name varchar,
age integer,
address varchar) split on (10, 20, 30, 40)
#split后为切割点
上記により 5 つの領域が作成され、行キーの範囲は次のようになります。
領域 1: 行キーの最初の 2 桁は min~10
領域 2: 行キーの最初の 2 桁は 10~20
領域 3: 最初の行キーの 2 桁は 20 ~ 30
領域 4:行キーの最初の 2 桁は 30 ~ 40
領域 5:行キーの最初の 2 桁は 40 ~最大
2. 圧縮を指定して大きなテーブルのパフォーマンスを向上させる
create table test
(id integer primary key,
name varchar,
age integer,
address varchar) split on (10, 20, 30, 40),COMPRESSION='GZ'
#split后为切割点
3. アプリケーションは Phoenix JDBC 接続プールを使用しますか?
接続プールの使用は推奨されません。Phoenix の接続オブジェクトは、最下層が Hbase の接続であるため、ほとんどの JDBC 接続とは異なります。Phoenix 接続オブジェクトは、より細かく、より安価に作成できるように設計されています。Phoenix の接続が再利用される場合、基になる HBase 接続が前のユーザーによって常に正常な状態に保たれるとは限りません。より良いアプローチは、潜在的な問題を確実に回避するために、新しい Phoenix 接続を作成することです。
4.書き込みの最適化
upsert を使用して大量のデータを書き込む場合は、自動コミットをオフにして、小さなバッチで送信してください。
try (Connection conn = DriverManager.getConnection(url)) {
conn.setAutoCommit(false);
int batchSize = 0;
int commitSize = 1000; // 每一批提交数.
try (Statement stmt = conn.prepareStatement(upsert)) {
stmt.set ... while (there are records to upsert) {
stmt.executeUpdate();
batchSize++;
if (batchSize % commitSize == 0) {
conn.commit();
}
}
conn.commit(); // commit the last batch of records
注: シン クライアントでは、クライアントとサーバーへのクエリの RPC の数が最小限に抑えられるため、executeBatch() を使用することが非常に重要です。
5. RPC インタラクションを削減する
Phoenix には、テーブルの設計時にテーブルレベルのパラメータ UPDATE_CACHE_FREQUENCY があります。この値は常にデフォルトです。これは、すべての SQL クエリが最初にメタデータをリクエストすることを意味します。これにより、リクエストのプレッシャーが増大し、パフォーマンスに一定の影響を及ぼします。
テーブルを作成するときに、このパラメータを同期する頻度を指定することをお勧めします。
CREATE TABLE IF NOT EXISTS test_user (
id VARCHAR NOT NULL PRIMARY KEY,
username VARCHAR ,
phoen VARCHAR ,
addr VARCHAR,
times bigint) UPDATE_CACHE_FREQUENCY = 900000;
#客户端应每15分钟检查表或其统计信息的更新
#修改已有表
alter table 表名 set UPDATE_CACHE_FREQUENCY = 时间(毫秒)。