Dalam dokumen PostgreSQL untuk Kendala , katanya
Batasan bukan-nol secara fungsional setara dengan membuat batasan periksa
CHECK (column_name IS NOT NULL)
, tetapi dalam PostgreSQL membuat batasan bukan-nol eksplisit lebih efisien.
aku bertanya-tanya
- Apa sebenarnya yang dimaksud dengan "lebih efisien"?
- Apa kerugian menggunakan
CHECK (column_name IS NOT NULL)
bukanSET NOT NULL
?
Saya ingin dapat menambahkan NOT VALID
CHECK
kendala dan memvalidasinya secara terpisah (jadi AccessExclusiveLock
hanya ditahan untuk waktu yang singkat untuk penambahan kendala dan kemudian ShareUpdateExclusiveLock
ditahan untuk langkah validasi yang lebih lama):
ALTER TABLE table_name
ADD CONSTRAINT column_constraint
CHECK (column_name IS NOT NULL)
NOT VALID;
ALTER TABLE table_name
VALIDATE CONSTRAINT column_constraint;
Dari pada:
ALTER TABLE table_name
ALTER COLUMN column_name
SET NOT NULL;
postgresql
postgresql-9.5
check-constraints
Robin Joseph
sumber
sumber
not in
dengan kedua varian? Apakah mereka sama atau berbeda?Jawaban:
Tebakan liar saya: "lebih efisien" berarti "lebih sedikit waktu diperlukan untuk melakukan pemeriksaan" (keunggulan waktu). Ini juga bisa berarti "lebih sedikit memori yang diperlukan untuk melakukan pemeriksaan" (keunggulan ruang). Mungkin juga berarti "memiliki lebih sedikit efek samping" (seperti tidak mengunci sesuatu atau menguncinya untuk periode waktu yang lebih singkat) ... tetapi saya tidak memiliki cara untuk mengetahui atau memeriksa "keuntungan ekstra".
Saya tidak bisa memikirkan cara mudah untuk memeriksa kemungkinan keuntungan ruang (yang, saya kira, tidak begitu penting ketika memori saat ini murah). Di sisi lain, itu tidak sulit untuk memeriksa kemungkinan waktu keuntungan: hanya membuat dua tabel yang sama, dengan satu-satunya pengecualian dari kendala tersebut. Masukkan jumlah baris yang cukup besar, ulangi beberapa kali, dan periksa waktunya.
Ini adalah pengaturan tabel:
Ini adalah tabel tambahan, yang digunakan untuk menyimpan timing:
Dan ini adalah tes yang dilakukan, menggunakan pgAdmin III, dan fitur pgScript .
Hasilnya dirangkum dalam kueri berikut:
Dengan hasil sebagai berikut:
Grafik nilai menunjukkan variabilitas penting:
Jadi, dalam praktiknya, PERIKSA (kolom BUKAN NULL) sangat sedikit lebih lambat (0,5%). Namun, perbedaan kecil ini bisa disebabkan oleh alasan acak, asalkan variabilitas waktunya jauh lebih besar dari itu. Jadi, ini tidak signifikan secara statistik.
Dari sudut pandang praktis, saya akan sangat mengabaikan "lebih efisien"
NOT NULL
, karena saya tidak benar-benar melihatnya penting; sedangkan saya berpikir bahwa tidak adanya suatuAccessExclusiveLock
adalah keuntungan.sumber