Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Indeks asinkron di Aurora DSQL
CREATE INDEX ASYNC
Perintah membuat indeks pada satu atau lebih kolom dari tabel tertentu. Perintah ini adalah operasi DDL asinkron yang tidak memblokir transaksi lain. Ketika Anda menjalankanCREATE INDEX ASYNC
, Aurora DSQL segera mengembalikan file. job_id
Anda dapat memantau status pekerjaan asinkron ini menggunakan tampilan sistem. sys.jobs
Saat pekerjaan pembuatan indeks sedang berlangsung, Anda dapat menggunakan prosedur dan perintah ini:
sys.wait_for_job(job_id)
'your_index_creation_job_id'
-
Memblokir sesi saat ini sampai pekerjaan yang ditentukan selesai atau gagal. Mengembalikan nilai Boolean yang menunjukkan keberhasilan atau kegagalan.
DROP INDEX
-
Membatalkan pekerjaan pembuatan indeks yang sedang berlangsung.
Ketika pembuatan indeks asinkron selesai, Aurora DSQL memperbarui katalog sistem untuk menandai indeks sebagai aktif.
catatan
Perhatikan bahwa transaksi bersamaan yang mengakses objek di namespace yang sama selama pembaruan ini mungkin mengalami kesalahan konkurensi.
Ketika Aurora DSQL menyelesaikan tugas indeks asinkron, Aurora akan memperbarui katalog sistem untuk menunjukkan bahwa indeks aktif. Jika transaksi lain mereferensikan objek di namespace yang sama saat ini, Anda mungkin melihat kesalahan konkurensi.
Sintaksis
CREATE INDEX ASYNC
menggunakan sintaks berikut.
CREATE [ UNIQUE ] INDEX ASYNC [ IF NOT EXISTS ] name ON table_name ( { column_name } [ NULLS { FIRST | LAST } ] ) [ INCLUDE ( column_name [, ...] ) ] [ NULLS [ NOT ] DISTINCT ]
Parameter
UNIQUE
-
Menunjukkan ke Aurora DSQL untuk memeriksa nilai duplikat dalam tabel saat membuat indeks dan setiap kali Anda menambahkan data. Jika Anda menentukan parameter ini, menyisipkan dan memperbarui operasi yang akan menghasilkan entri duplikat menghasilkan kesalahan.
IF NOT EXISTS
-
Menunjukkan bahwa Aurora DSQL seharusnya tidak membuang pengecualian jika indeks dengan nama yang sama sudah ada. Dalam situasi ini, Aurora DSQL tidak membuat indeks baru. Perhatikan bahwa indeks yang Anda coba buat bisa memiliki struktur yang sangat berbeda dari indeks yang ada. Jika Anda menentukan parameter ini, nama indeks diperlukan.
name
-
Nama indeks. Anda tidak dapat menyertakan nama skema Anda dalam parameter ini.
Aurora DSQL membuat indeks dalam skema yang sama dengan tabel induknya. Nama indeks harus berbeda dari nama objek lain, seperti tabel atau indeks, dalam skema.
Jika Anda tidak menentukan nama, Aurora DSQL menghasilkan nama secara otomatis berdasarkan nama tabel induk dan kolom yang diindeks. Misalnya, jika Anda menjalankan
CREATE INDEX ASYNC on table1 (col1, col2)
, Aurora DSQL secara otomatis memberi nama indeks.table1_col1_col2_idx
NULLS FIRST | LAST
-
Urutan urutan kolom null dan non-null.
FIRST
menunjukkan bahwa Aurora DSQL harus mengurutkan kolom nol sebelum kolom non-null.LAST
menunjukkan bahwa Aurora DSQL harus mengurutkan kolom null setelah kolom non-null. INCLUDE
-
Daftar kolom untuk disertakan dalam indeks sebagai kolom non-kunci. Anda tidak dapat menggunakan kolom non-kunci dalam kualifikasi pencarian pemindaian indeks. Aurora DSQL mengabaikan kolom dalam hal keunikan untuk indeks.
NULLS DISTINCT | NULLS NOT DISTINCT
-
Menentukan apakah Aurora DSQL harus mempertimbangkan nilai null sebagai berbeda dalam indeks unik. Defaultnya adalah
DISTINCT
, yang berarti bahwa indeks unik dapat berisi beberapa nilai null dalam kolom.NOT DISTINCT
menunjukkan bahwa indeks tidak dapat berisi beberapa nilai null dalam kolom.
Catatan penggunaan
Pertimbangkan panduan berikut ini:
-
CREATE INDEX ASYNC
Perintah tidak memperkenalkan kunci. Ini juga tidak mempengaruhi tabel dasar yang Aurora DSQL gunakan untuk membuat indeks. -
Selama operasi migrasi skema,
sys.wait_for_job(job_id)
prosedur ini berguna. Ini memastikan bahwa operasi DDL dan DML berikutnya menargetkan indeks yang baru dibuat.'your_index_creation_job_id'
-
Setiap kali Aurora DSQL menjalankan tugas asinkron baru, ia memeriksa
sys.jobs
tampilan dan menghapus tugas yang memiliki status atau selama lebih dari 30 menit.completed
failed
Jadi,sys.jobs
terutama menunjukkan tugas yang sedang berlangsung dan tidak berisi informasi tentang tugas-tugas lama. -
Jika Aurora DSQL gagal membangun indeks asinkron, indeks tetap ada.
INVALID
Untuk indeks unik, operasi DHTML tunduk pada kendala keunikan sampai Anda menjatuhkan indeks. Kami menyarankan Anda menjatuhkan indeks yang tidak valid dan membuatnya kembali.
Membuat indeks: contoh
Contoh berikut menunjukkan cara membuat skema, tabel, dan kemudian indeks.
-
Buat tabel bernama
test.departments
.CREATE SCHEMA test; CREATE TABLE test.departments (name varchar(255) primary key NOT null, manager varchar(255), size varchar(4));
-
Masukkan baris ke dalam tabel.
INSERT INTO test.departments VALUES ('Human Resources', 'John Doe', '10')
-
Buat indeks asinkron.
CREATE INDEX ASYNC test_index on test.departments(name, manager, size);
CREATE INDEX
Perintah mengembalikan ID pekerjaan, seperti yang ditunjukkan di bawah ini.job_id -------------------------- jh2gbtx4mzhgfkbimtgwn5j45y
job_id
Ini menunjukkan bahwa Aurora DSQL telah mengirimkan pekerjaan baru untuk membuat indeks. Anda dapat menggunakan prosedursys.wait_for_job(job_id)
untuk memblokir pekerjaan lain pada sesi sampai pekerjaan selesai atau habis waktu.'your_index_creation_job_id'
Menanyakan status pembuatan indeks: contoh
Kueri tampilan sys.jobs
sistem untuk memeriksa status pembuatan indeks Anda, seperti yang ditunjukkan pada contoh berikut.
SELECT * FROM sys.jobs
Aurora DSQL mengembalikan respon yang mirip dengan berikut ini.
job_id | status | details ----------------------------+------------+--------- vs3kcl3rt5ddpk3a6xcq57cmcy | completed | ihbyw2aoirfnrdfoc4ojnlamoq | processing |
Kolom status dapat menjadi salah satu nilai berikut.
submitted |
processing |
failed |
completed |
---|---|---|---|
Tugas dikirimkan, tetapi Aurora DSQL belum mulai memprosesnya. | Aurora DSQL sedang memproses tugas. | Tugas gagal. Lihat kolom detail untuk informasi lebih lanjut. Jika Aurora DSQL gagal membangun indeks, Aurora DSQL tidak secara otomatis menghapus definisi indeks. Anda harus menghapus indeks secara manual dengan DROP INDEX perintah. |
Aurora DSQL |
Anda juga dapat menanyakan status indeks melalui tabel katalog pg_index
danpg_class
. Secara khusus, atribut indisvalid
dan indisimmediate
dapat memberi tahu Anda status indeks Anda. Sementara Aurora DSQL membuat indeks Anda, ia memiliki status awal. INVALID
indisvalid
Bendera untuk indeks mengembalikan FALSE
atauf
, yang menunjukkan bahwa indeks tidak valid. Jika bendera kembali TRUE
ataut
, indeks siap.
SELECT relname AS index_name, indisvalid as is_valid, pg_get_indexdef(indexrelid) AS index_definition from pg_index, pg_class WHERE pg_class.oid = indexrelid AND indrelid = 'test.departments'::regclass;
index_name | is_valid | index_definition ------------------+----------+------------------------------------------------------------------------------------------------------------------- department_pkey | t | CREATE UNIQUE INDEX department_pkey ON test.departments USING btree_index (title) INCLUDE (name, manager, size) test_index1 | t | CREATE INDEX test_index1 ON test.departments USING btree_index (name, manager, size)
Kegagalan pembuatan indeks unik
Jika pekerjaan pembuatan indeks unik asinkron Anda menunjukkan status gagal dengan detailFound duplicate key while validating index for UCVs
, ini menunjukkan bahwa indeks unik tidak dapat dibuat karena pelanggaran batasan keunikan.
Untuk mengatasi kegagalan pembuatan indeks unik
-
Hapus baris apa pun di tabel utama Anda yang memiliki entri duplikat untuk kunci yang ditentukan dalam indeks sekunder unik Anda.
-
Jatuhkan indeks yang gagal.
-
Keluarkan perintah buat indeks baru.
Mendeteksi pelanggaran keunikan di tabel utama
Kueri SQL berikut membantu Anda mengidentifikasi nilai duplikat dalam kolom tertentu dari tabel Anda. Ini sangat berguna ketika Anda perlu menerapkan keunikan pada kolom yang saat ini tidak ditetapkan sebagai kunci utama atau tidak memiliki kendala unik, seperti alamat email dalam tabel pengguna.
Contoh di bawah ini menunjukkan cara membuat tabel pengguna sampel, mengisinya dengan data uji yang berisi duplikat yang diketahui, dan kemudian menjalankan kueri deteksi.
Tentukan skema tabel
-- Drop the table if it exists DROP TABLE IF EXISTS users; -- Create the users table with a simple integer primary key CREATE TABLE users ( user_id INTEGER PRIMARY KEY, email VARCHAR(255), first_name VARCHAR(100), last_name VARCHAR(100), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
Masukkan data sampel yang mencakup kumpulan alamat email duplikat
-- Insert sample data with explicit IDs INSERT INTO users (user_id, email, first_name, last_name) VALUES (1, 'john.doe@example.com', 'John', 'Doe'), (2, 'jane.smith@example.com', 'Jane', 'Smith'), (3, 'john.doe@example.com', 'Johnny', 'Doe'), (4, 'alice.wong@example.com', 'Alice', 'Wong'), (5, 'bob.jones@example.com', 'Bob', 'Jones'), (6, 'alice.wong@example.com', 'Alicia', 'Wong'), (7, 'bob.jones@example.com', 'Robert', 'Jones');
Jalankan kueri deteksi duplikat
-- Query to find duplicates WITH duplicates AS ( SELECT email, COUNT(*) as duplicate_count FROM users GROUP BY email HAVING COUNT(*) > 1 ) SELECT u.*, d.duplicate_count FROM users u INNER JOIN duplicates d ON u.email = d.email ORDER BY u.email, u.user_id;
Lihat semua catatan dengan alamat email duplikat
user_id | email | first_name | last_name | created_at | duplicate_count ---------+------------------------+------------+-----------+----------------------------+----------------- 4 | akua.mansa@example.com | Akua | Mansa | 2025-05-21 20:55:53.714432 | 2 6 | akua.mansa@example.com | Akua | Mansa | 2025-05-21 20:55:53.714432 | 2 1 | john.doe@example.com | John | Doe | 2025-05-21 20:55:53.714432 | 2 3 | john.doe@example.com | Johnny | Doe | 2025-05-21 20:55:53.714432 | 2 (4 rows)
Jika kita mencoba pernyataan pembuatan indeks sekarang, itu akan gagal:
postgres=> CREATE UNIQUE INDEX ASYNC idx_users_email ON users(email); job_id ---------------------------- ve32upmjz5dgdknpbleeca5tri (1 row) postgres=> select * from sys.jobs; job_id | status | details | job_type | class_id | object_id | object_name | start_time | update_time ----------------------------+-----------+-----------------------------------------------------+-------------+----------+-----------+------------------------+------------------------+------------------------ qpn6aqlkijgmzilyidcpwrpova | completed | | DROP | 1259 | 26384 | | 2025-05-20 00:47:10+00 | 2025-05-20 00:47:32+00 ve32upmjz5dgdknpbleeca5tri | failed | Found duplicate key while validating index for UCVs | INDEX_BUILD | 1259 | 26396 | public.idx_users_email | 2025-05-20 00:49:49+00 | 2025-05-20 00:49:56+00 (2 rows)