Saat ini saya sedang mencari cara untuk menambahkan indeks ke database PostgreSQL saya dalam pengembangan. Basis data pada dasarnya adalah basis data pelanggan, yang akan menampung sekitar 5 juta catatan pelanggan di tabel Pelanggan, dan semua tabel lainnya adalah anak-anak dari Pelanggan, dan mungkin berisi satu atau lebih catatan yang dikaitkan kembali ke pelanggan.

Sebagian besar operasi akan mencari satu pelanggan, atau memperbarui satu pelanggan, atau menambahkan satu pelanggan.

Sekarang untuk bagian saya, saya memiliki kunci utama yang sesuai pada tabel pelanggan dan lainnya, jadi saya memiliki indeks di sana. Saya juga membaca bahwa indeks pada kolom kunci asing di tabel anak adalah praktik yang baik. Jadi saya telah membuat yang di bawah ini:

CREATE INDEX idx_cust_contact ON contact_information (customer_internal_id);
CREATE INDEX idx_cust_address ON address (customer_internal_id);
CREATE INDEX idx_cust_mkpref ON marketing_preferences (customer_internal_id);
CREATE INDEX idx_cust_content ON content_type_preferences (customer_internal_id);
CREATE INDEX idx_cust_cards ON external_cards (customer_internal_id);

Ini akan membantu kueri untuk mencari pelanggan dengan penggabungan yang dilakukan oleh customer_internal_id. Saat meninjau semua kueri yang dibuat perangkat lunak saya, saya menemukan jenis kueri umum ini.

Kontak informasi

  • Informasi Kontak - di mana jenis kontak = dan nilai kontak =
  • Informasi Kontak - di mana jenis kontak =

Pelanggan

  • Pelanggan - di mana nama depan dan nama belakang.
  • Pelanggan - di mana nama depan dan nama belakang dan DOB

Kartu Eksternal

  • Kartu eksternal - WHERE nomor kartu =
  • Kartu eksternal - WHERE nomor kartu = DAN status kartu =

Pertanyaan saya adalah, mari kita ambil pertanyaan Informasi Kontak, kami paling sering mencari detail kontak berdasarkan jenis kontak dan nilai kontak, atau hanya jenis kontak. Saat tipe kontak muncul di kedua klausa where, apakah saya baru saja membuat

A) Indeks kolom tunggal pada masing-masing? c) Satu indeks multi-kolom yang berisi jenis kontak dan nilai kontak, lalu indeks kolom tunggal yang berisi jenis kontak?

Contoh query untuk mendapatkan ID pelanggan dari nomor kartu:

SELECT e.customer_internal_id

FROM external_cards AS e

WHERE e.card_number = @__request_CustomerSearchParameters_CardNumber_0

Contoh query untuk mendapatkan pelanggan berdasarkan Id:

SELECT c.customer_internal_id, c.business_partner_id, c.created_date, c.customer_type, c.date_of_birth, c.first_name, c.gender, c.home_store_id, c.home_store_updated, c.last_name, c.loyalty_db_id, c.mca_id, c.status, c.status_reason, c.store_joined, c.title, c.updated_by, c.updated_date, c.updating_store, c0.contact_internal_id, c0.contact_type, c0.contact_value, c0.created_date, c0.customer_internal_id, c0.updated_by, c0.updated_date, c0.updating_store, c0.validated, a.address_internal_id, a.address_line_1, a.address_line_2, a.address_type, a.address_undeliverable, a.address_validated, a.country, a.created_date, a.customer_internal_id, a.postcode, a.region, a.suburb, a.updated_by, a.updated_date, a.updating_store, m.customer_internal_id, m.channel_id, m.created_date, m.opt_in, m.updated_by, m.updated_date, m.updating_store, m.valid_from_date, c1.customer_internal_id, c1.channel_id, c1.type_id, c1.created_date, c1.opt_in, c1.updated_by, c1.updated_date, c1.updating_store, c1.valid_from_date, e.customer_internal_id, e.card_number, e.card_design, e.card_status, e.card_type, e.created_date, e.updated_by, e.updated_date, e.updating_store

FROM customer AS c

LEFT JOIN contact_information AS c0 ON c.customer_internal_id = c0.customer_internal_id

LEFT JOIN address AS a ON c.customer_internal_id = a.customer_internal_id

LEFT JOIN marketing_preferences AS m ON c.customer_internal_id = m.customer_internal_id

LEFT JOIN content_type_preferences AS c1 ON c.customer_internal_id = c1.customer_internal_id

LEFT JOIN external_cards AS e ON c.customer_internal_id = e.customer_internal_id

WHERE c.customer_internal_id IN ('322e612b-89e7-4c1e-bdc5-5ec3e42adae8')

ORDER BY c.customer_internal_id, c0.contact_internal_id, c0.contact_type, a.address_internal_id, m.customer_internal_id, m.channel_id, c1.customer_internal_id, c1.channel_id, c1.type_id, e.customer_internal_id, e.card_number 

Saat ini saya tidak dapat mengakses output EXPLAIN, tetapi akan mencoba mengumpulkan dan memperbarui di sini.

0
JamesMatson 7 Juli 2020, 06:35

1 menjawab

Jawaban Terbaik

Untuk menjawab pertanyaan Anda, indeks dua kolom pada jenis kontak dan nilai kontak (dalam urutan ini!) akan menjadi yang paling sesuai. Ini juga dapat digunakan untuk kondisi WHERE pada jenis kontak saja.

Perhatikan bahwa kondisi IN (...) tidak sama dengan kondisi =, kecuali daftar hanya memiliki satu elemen.

Kueri yang Anda tampilkan menunjukkan anti-pola: kueri satu tabel, lalu kueri tabel lain dengan hasil yang ditemukan di kueri pertama. Ini lebih efisien dilakukan dengan menggabungkan tabel.

0
Laurenz Albe 7 Juli 2020, 05:49