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
Per CREATE INDEX ASYNC intah membuat indeks pada satu atau lebih kolom dari tabel tertentu. Perintah ini adalah operasi DDL asinkron yang tidak memblokir transaksi lain. Saat Anda menjalankanCREATE INDEX ASYNC, Aurora DSQL segera mengembalikan ajob_id.
Anda dapat memantau status pekerjaan asinkron ini menggunakan tampilan sys.jobs sistem. Saat pekerjaan pembuatan indeks sedang berlangsung, Anda dapat menggunakan prosedur dan perintah berikut:
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 dalam namespace yang sama selama pembaruan ini mungkin mengalami kesalahan konkurensi.
Ketika Aurora DSQL menyelesaikan tugas indeks asinkron, itu memperbarui katalog sistem untuk menunjukkan bahwa indeks aktif. Jika transaksi lain mereferensikan objek dalam namespace yang sama saat ini, Anda mungkin melihat kesalahan konkurensi.
Untuk sintaks yang didukung dan deskripsi setiap parameter, lihatCREATE INDEX.
Catatan penggunaan
Pertimbangkan panduan berikut ini:
-
Per
CREATE INDEX ASYNCintah tidak memperkenalkan kunci. Ini juga tidak mempengaruhi tabel dasar yang digunakan Aurora DSQL 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.jobstampilan dan menghapus tugas yang memiliki statuscompletedataufailedselama lebih dari 30 menit. Dengan demikian,sys.jobsterutama menunjukkan tugas yang sedang berlangsung dan tidak berisi informasi tentang tugas lama. -
Jika Aurora DSQL gagal membangun indeks asinkron, indeks tetap ada.
INVALIDUntuk indeks unik, operasi DML tunduk pada batasan keunikan sampai Anda menghapus indeks. Kami menyarankan Anda menghapus 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);Per
CREATE INDEXintah mengembalikan ID pekerjaan, seperti yang ditunjukkan di bawah ini.job_id -------------------------- jh2gbtx4mzhgfkbimtgwn5j45yIni
job_idmenunjukkan 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 waktu habis.'your_index_creation_job_id'
Menanyakan status pembuatan indeks: contoh
Kueri sys.jobs tampilan sistem untuk memeriksa status pembuatan indeks Anda, seperti yang ditunjukkan pada contoh berikut.
SELECT * FROM sys.jobs where job_id = 'wqhu6ewifze5xitg3umt24h5ua';
Aurora DSQL mengembalikan respons yang mirip dengan berikut ini.
job_id | status | details | job_type | class_id | object_id | object_name | start_time | update_time ----------------------------+-----------+---------+-------------+----------+-----------+-------------------+------------------------+------------------------ wqhu6ewifze5xitg3umt24h5ua | completed | | INDEX_BUILD | 1259 | 26433 | public.nt2_c1_idx | 2025-09-25 22:07:31+00 | 2025-09-25 22:07:46+00
Kolom status dapat menjadi salah satu nilai berikut.
| Status | Deskripsi |
|---|---|
submitted |
Tugas diserahkan, tetapi Aurora DSQL belum mulai memprosesnya. |
processing |
Aurora DSQL sedang memproses tugas. |
failed |
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. |
completed |
Aurora DSQL telah menyelesaikan tugas dengan sukses. |
Anda juga dapat menanyakan keadaan 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, itu memiliki status awalINVALID. indisvalidBendera untuk indeks mengembalikan FALSE atauf, yang menunjukkan bahwa indeks tidak valid. Jika bendera kembali TRUE ataut, indeks sudah 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 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 setiap baris di tabel utama yang memiliki entri duplikat untuk kunci yang ditentukan dalam indeks sekunder unik Anda.
-
Jatuhkan indeks yang gagal.
-
Keluarkan perintah create index baru.
Mendeteksi pelanggaran keunikan di tabel utama
Query 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 batasan 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)