select value
from persons p join persons2 p2
on left(p.lastname,1) = left(p2.lastname,1)
SQL Server. Apakah ada cara untuk membuat SARGable ini / berjalan lebih cepat? Saya tidak bisa membuat kolom di tabel orang, tapi saya bisa membuat kolom di orang2.
sql-server
lastchancexi
sumber
sumber
Jawaban:
Buat tampilan pada tabel dengan kolom yang dihitung tetap didefinisikan sebagai
LEFT(lastname, 1)
masing-masing tabel, lalu bandingkan nilai-nilai kolom tetap yang dihitung.Berikut adalah test-bed yang menunjukkan cara melakukannya:
Di sini, kami akan memasukkan beberapa data sampel:
Inilah
SELECT
pertanyaannya:Dan hasilnya:
Rencana eksekusi, dengan hanya dua baris per tabel (harus diakui tidak banyak baris!)
sumber
Jika
lastname
kolom diindeks setidaknya dalam satu tabel maka Anda juga bisa menggunakanLIKE
Rencana untuk ini dapat memiliki pencarian di atas meja yang ditentukan di sebelah kiri sejenisnya.
yaitu
ON p.lastname LIKE LEFT(p2.lastname, 1) + '%'
tidak akan dapat menggunakan indeks padapersons2
yang digunakan di atas tetapi bisa mencari satupersons
.Namun, saran dalam jawaban lain untuk mengindeks kolom terhitung di kedua sisi lebih fleksibel. Adapun rencana loop bersarang tabel baik dapat di dalam dan itu juga akan memungkinkan banyak bergabung banyak bergabung tanpa memerlukan semacam.
sumber
Saya kebetulan memiliki tabel dengan 3.423 baris dan 195 nilai berbeda di
Name
. Saya akan memanggil tabel iniP
(orang) dan menduplikasinya untuk membuatP2
(person2). Ada kunci primer unik dan berkerumun di kolom ID integer. Saya menggunakan Microsoft SQL Server 2016 (KB3194716) Edisi Pengembang (64-bit) pada Windows 10 Pro 6.3 dengan 32GB RAM.Dengan kueri basis
Saya mendapatkan baris 1,5M yang dikembalikan dalam 3200-3300ms (dari statistik io).
Dengan menulis ulang demikian -
berkurang berkurang menjadi 50-60 ms dan rencananya adalah:
Lebih sedikit baris dikembalikan (3.423) karena algoritma pencocokan. Paket dan jumlah baris yang sama dicapai dengan mengubah kueri basis menjadi
select distinct
.Dengan membuat indeks, kolom dihitung
Waktu yang berlalu turun menjadi 45-50ms.
sumber