Tablestore memungkinkan Anda membaca satu baris data atau data dengan nilai kunci primer dalam rentang tertentu dari tabel indeks. Jika tabel indeks mencakup kolom atribut yang ingin diambil, Anda dapat membaca langsung dari tabel indeks. Namun, jika tidak, Anda harus menanyakan data dari tabel utama tempat indeks dibuat.
Indeks sekunder terbagi menjadi indeks sekunder global dan lokal. Untuk detail lebih lanjut mengenai fitur indeks sekunder, lihat Indeks Sekunder.
Prasyarat
Sebuah instance OTSClient telah diinisialisasi. Untuk informasi lebih lanjut, lihat Inisialisasi klien Tablestore.
Sebuah indeks sekunder telah dibuat. Untuk informasi lebih lanjut, lihat Buat indeks sekunder.
Catatan Penggunaan
Anda hanya dapat menggunakan tabel indeks untuk membaca data.
Kolom kunci primer pertama dari indeks sekunder lokal harus sama dengan kolom kunci primer pertama dari tabel data.
Jika kolom atribut yang ingin diambil tidak ada dalam tabel indeks, Anda perlu menanyakan data dari tabel utama tempat indeks dibuat untuk mendapatkan kolom atribut tersebut.
Baca satu baris data
Anda dapat memanggil operasi GetRow untuk membaca satu baris data. Untuk informasi lebih lanjut, lihat Baca satu baris data.
Parameter
Saat memanggil operasi GetRow untuk membaca data dari tabel indeks, perhatikan hal-hal berikut:
Atur parameter tableName ke nama tabel indeks.
Tablestore secara otomatis menambahkan kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks ke tabel indeks sebagai kolom kunci primer tambahan. Oleh karena itu, saat menentukan kolom kunci primer dari sebuah baris dalam tabel indeks, Anda harus menyertakan kolom indeks yang digunakan untuk membuat tabel indeks serta kolom kunci primer dari tabel data.
Contoh
Kode sampel berikut menunjukkan cara membaca kolom atribut tertentu dari sebuah baris dalam tabel indeks:
private static void getRowFromIndex(SyncClient client) {
// Bangun kunci primer. Jika Anda ingin membaca data dari indeks sekunder lokal, kolom kunci primer pertama dari tabel indeks harus sama dengan kolom kunci primer pertama dari tabel data.
PrimaryKeyBuilder primaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
primaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.fromString("def1"));
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.fromLong(100));
primaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.fromString("pri1"));
PrimaryKey primaryKey = primaryKeyBuilder.build();
// Tentukan nama tabel indeks dari mana Anda ingin membaca satu baris data dan kunci primer dari baris tersebut.
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<INDEX_NAME>", primaryKey);
// Atur parameter MaxVersions ke 1 untuk membaca versi terbaru dari data.
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row row = getRowResponse.getRow();
// Jika baris yang ingin Anda baca memang ada, null akan dikembalikan.
System.out.println("Pembacaan selesai. Hasil:");
System.out.println(row);
// Tentukan kolom atribut yang ingin Anda baca.
criteria.addColumnsToGet("Col0");
getRowResponse = client.getRow(new GetRowRequest(criteria));
row = getRowResponse.getRow();
System.out.println("Pembacaan selesai. Hasil:");
System.out.println(row);
} Baca data yang nilai kunci primernya berada dalam rentang tertentu
Anda dapat memanggil operasi GetRange untuk membaca data dengan nilai kunci primer dalam rentang tertentu. Untuk informasi lebih lanjut, lihat Baca data yang nilai kunci primernya berada dalam rentang tertentu.
Parameter
Saat memanggil operasi GetRange untuk membaca data dari tabel indeks, perhatikan hal-hal berikut:
Atur parameter tableName ke nama tabel indeks.
Tablestore secara otomatis menambahkan kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks ke tabel indeks sebagai kolom kunci primer tambahan. Oleh karena itu, saat menentukan kunci primer awal dan akhir dari rentang yang ingin ditanyakan, Anda harus menyertakan kolom indeks yang digunakan untuk membuat tabel indeks serta kolom kunci primer dari tabel data.
Contoh
Gunakan indeks sekunder global
Jika tabel indeks mencakup kolom atribut yang ingin diambil, Anda dapat menanyakan data yang diperlukan dari tabel indeks.
private static void scanFromIndex(SyncClient client) {
// Tentukan nama tabel indeks.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>");
// Tentukan kunci primer awal dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());
// Tentukan kunci primer akhir dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
System.out.println("Hasil yang dikembalikan dari tabel indeks:");
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
System.out.println(row);
}
// Jika parameter nextStartPrimaryKey tidak null dalam respons, lanjutkan membaca data.
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
}Jika tabel indeks tidak mencakup kolom atribut yang ingin diambil, Anda perlu menanyakan data yang diperlukan dari tabel data.
private static void scanFromIndex(SyncClient client) {
// Tentukan nama tabel indeks.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>");
// Tentukan kunci primer awal dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());
// Tentukan kunci primer akhir dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
// Tentukan kunci primer dari tabel data berdasarkan kunci primer dari tabel indeks.
PrimaryKey mainTablePK = mainTablePKBuilder.build();
// Tanyakan data dari tabel data.
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("<TABLE_NAME>", mainTablePK);
// Tentukan kolom atribut yang ingin Anda kembalikan. Dalam contoh ini, kolom DEFINED_COL_NAME_3 dikembalikan.
criteria.addColumnsToGet(DEFINED_COL_NAME_3);
// Atur parameter MaxVersions ke 1 untuk membaca versi terbaru dari data.
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row mainTableRow = getRowResponse.getRow();
System.out.println(row);
}
// Jika parameter nextStartPrimaryKey tidak null dalam respons, lanjutkan membaca data.
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
}Gunakan indeks sekunder lokal
Jika tabel indeks mencakup kolom atribut yang ingin diambil, Anda dapat menanyakan data yang diperlukan dari tabel indeks.
private static void scanFromIndex(SyncClient client) {
// Tentukan nama tabel indeks.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("INDEX_NAME");
// Tentukan kunci primer awal dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());
// Tentukan kunci primer akhir dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
System.out.println("Hasil yang dikembalikan dari tabel indeks:");
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
System.out.println(row);
}
// Jika parameter nextStartPrimaryKey tidak null dalam respons, lanjutkan membaca data.
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
}Jika tabel indeks tidak mencakup kolom atribut yang ingin diambil, Anda perlu menanyakan data yang diperlukan dari tabel data.
private static void scanFromIndex(SyncClient client) {
// Tentukan nama tabel indeks.
RangeRowQueryCriteria rangeRowQueryCriteria = new RangeRowQueryCriteria("<INDEX_NAME>");
// Tentukan kunci primer awal dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder startPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MIN);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas kecil.
startPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MIN);
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(startPrimaryKeyBuilder.build());
// Tentukan kunci primer akhir dari rentang yang ingin Anda tanyakan.
PrimaryKeyBuilder endPrimaryKeyBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
// Atur nilai kolom indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(DEFINED_COL_NAME_1, PrimaryKeyValue.INF_MAX);
// Atur nilai kolom kunci primer dari tabel data yang tidak ditentukan sebagai kolom indeks dalam tabel indeks ke nilai tak terbatas besar.
endPrimaryKeyBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, PrimaryKeyValue.INF_MAX);
rangeRowQueryCriteria.setExclusiveEndPrimaryKey(endPrimaryKeyBuilder.build());
rangeRowQueryCriteria.setMaxVersions(1);
while (true) {
GetRangeResponse getRangeResponse = client.getRange(new GetRangeRequest(rangeRowQueryCriteria));
for (Row row : getRangeResponse.getRows()) {
PrimaryKey curIndexPrimaryKey = row.getPrimaryKey();
PrimaryKeyColumn pk1 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_1);
PrimaryKeyColumn pk2 = curIndexPrimaryKey.getPrimaryKeyColumn(PRIMARY_KEY_NAME_2);
PrimaryKeyBuilder mainTablePKBuilder = PrimaryKeyBuilder.createPrimaryKeyBuilder();
mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_1, pk1.getValue());
mainTablePKBuilder.addPrimaryKeyColumn(PRIMARY_KEY_NAME_2, pk2.getValue());
// Tentukan kunci primer dari tabel data berdasarkan kunci primer dari tabel indeks.
PrimaryKey mainTablePK = mainTablePKBuilder.build();
// Tanyakan data dari tabel data.
SingleRowQueryCriteria criteria = new SingleRowQueryCriteria("TABLE_NAME", mainTablePK);
// Tentukan kolom atribut yang ingin Anda kembalikan dari tabel data. Dalam contoh ini, kolom DEFINED_COL_NAME3 dikembalikan.
criteria.addColumnsToGet(DEFINED_COL_NAME3);
// Atur parameter MaxVersions ke 1 untuk membaca versi terbaru dari data.
criteria.setMaxVersions(1);
GetRowResponse getRowResponse = client.getRow(new GetRowRequest(criteria));
Row mainTableRow = getRowResponse.getRow();
System.out.println(row);
}
// Jika parameter nextStartPrimaryKey tidak null dalam respons, lanjutkan membaca data.
if (getRangeResponse.getNextStartPrimaryKey() != null) {
rangeRowQueryCriteria.setInclusiveStartPrimaryKey(getRangeResponse.getNextStartPrimaryKey());
} else {
break;
}
}
}Tanya Jawab Umum
Referensi
Untuk bisnis yang memerlukan kueri multi-dimensi dan analisis data, Anda dapat membuat indeks pencarian dan menentukan atribut yang relevan sebagai bidang indeks. Kemudian, Anda dapat menggunakan indeks pencarian untuk menjalankan kueri berdasarkan kolom non-kunci primer, kueri Boolean, kueri fuzzy, mendapatkan nilai maksimum atau minimum, mengumpulkan statistik jumlah baris, dan mengelompokkan hasil kueri. Untuk informasi lebih lanjut, lihat Indeks Pencarian.
Jika Anda ingin menjalankan pernyataan SQL untuk menanyakan dan menganalisis data, Anda dapat menggunakan fitur kueri SQL. Untuk informasi lebih lanjut, lihat Kueri SQL.