Indeks asinkron di Aurora DSQL - Amazon Aurora DSQL

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 ASYNCPerintah 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 ASYNCmenggunakan 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 menjalankanCREATE 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. FIRSTmenunjukkan bahwa Aurora DSQL harus mengurutkan kolom nol sebelum kolom non-null. LASTmenunjukkan 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 adalahDISTINCT, yang berarti bahwa indeks unik dapat berisi beberapa nilai null dalam kolom. NOT DISTINCTmenunjukkan bahwa indeks tidak dapat berisi beberapa nilai null dalam kolom.

Catatan penggunaan

Pertimbangkan panduan berikut ini:

  • CREATE INDEX ASYNCPerintah 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)'your_index_creation_job_id' prosedur ini berguna. Ini memastikan bahwa operasi DDL dan DML berikutnya menargetkan indeks yang baru dibuat.

  • 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.

  1. Buat tabel bernamatest.departments.

    CREATE SCHEMA test; CREATE TABLE test.departments (name varchar(255) primary key NOT null, manager varchar(255), size varchar(4));
  2. Masukkan baris ke dalam tabel.

    INSERT INTO test.departments VALUES ('Human Resources', 'John Doe', '10')
  3. Buat indeks asinkron.

    CREATE INDEX ASYNC test_index on test.departments(name, manager, size);

    CREATE INDEXPerintah mengembalikan ID pekerjaan, seperti yang ditunjukkan di bawah ini.

    job_id -------------------------- jh2gbtx4mzhgfkbimtgwn5j45y

    job_idIni menunjukkan bahwa Aurora DSQL telah mengirimkan pekerjaan baru untuk membuat indeks. Anda dapat menggunakan prosedur sys.wait_for_job(job_id)'your_index_creation_job_id' untuk memblokir pekerjaan lain pada sesi sampai pekerjaan selesai atau habis waktu.

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 indisvalidBendera 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
  1. Hapus baris apa pun di tabel utama Anda yang memiliki entri duplikat untuk kunci yang ditentukan dalam indeks sekunder unik Anda.

  2. Jatuhkan indeks yang gagal.

  3. 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)