Mengoptimumkan Klausa WHERE: ANY vs. IN
Pilihan antara fasal ANY
dan IN
dalam SQL WHERE
selalunya bermuara kepada pengoptimuman prestasi. Kedua-dua pengendali mencapai matlamat asas yang sama – membandingkan nilai dengan set – tetapi ANY
memberikan fleksibiliti yang lebih besar dan boleh, dalam senario tertentu, membawa kepada peningkatan prestasi.
Perbandingan Sintaks
FasalIN
biasa kepada kebanyakan pengguna SQL:
expression IN (subquery)
expression IN (value1, value2, ...)
ANY
menawarkan fungsi yang serupa tetapi dengan lebih banyak pilihan:
expression operator ANY (subquery)
expression operator ANY (array expression)
Memilih Operator yang Tepat
ANY
, tambahan yang lebih moden kepada SQL, adalah serba boleh kerana ia berfungsi dengan mana-mana pengendali perbandingan yang menghasilkan hasil Boolean. IN
pada asasnya ialah kes khusus ANY
.
Pilihan optimum bergantung pada cara paling mudah untuk membekalkan set perbandingan: senarai nilai atau tatasusunan. Untuk data yang diperoleh terus daripada pangkalan data, subkueri atau JOIN
selalunya terbukti lebih cekap. Apabila berurusan dengan senarai nilai yang luas yang diluluskan daripada aplikasi, tatasusunan, unnest()
atau JOIN
secara amnya diutamakan untuk prestasi.
Bekerja dengan = ANY dan Arrays dalam PostgreSQL
PostgreSQL menyokong dua format ungkapan tatasusunan:
ARRAY[1, 2, 3]
'{1, 2, 3}'
Penghantaran jenis eksplisit (ARRAY[1, 2, 3]::numeric[]
atau '{1, 2, 3}'::bigint[]
) menghalang ralat berkaitan jenis.
Contoh: Hantaran Ruby dan Array
Untuk tatasusunan integer dalam Ruby:
MyModel.where('id = ANY(ARRAY[?]::int[])', ids.map { |i| i })
Ingat bahawa sintaks Ruby yang tepat untuk pengendalian tatasusunan mungkin berbeza bergantung pada rangka kerja ORM yang digunakan.
Atas ialah kandungan terperinci Bilakah Saya Harus Menggunakan MANA-MANA Daripada IN dalam Klausa WHERE?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!