Performa Luar dan Kinerja Gabung Kiri

37

Saya Menggunakan SQL SERVER 2008 R2

Saya baru saja menemukan BERLAKU dalam SQL dan menyukai bagaimana memecahkan masalah permintaan untuk banyak kasus,

Banyak tabel yang saya gunakan 2 kiri bergabung untuk mendapatkan hasilnya, saya bisa mendapatkan 1 terluar berlaku.

Saya memiliki sejumlah kecil data di tabel DB lokal saya dan setelah penerapan kode seharusnya dijalankan pada data minimal 20 kali besar.

Saya khawatir bahwa penerapan terluar mungkin memakan waktu lebih lama dari 2 kondisi gabung kiri untuk sejumlah besar data,

Adakah yang bisa tahu bagaimana sebenarnya berlaku bekerja dan bagaimana itu akan mempengaruhi kinerja dalam data yang sangat besar, Jika mungkin beberapa hubungan proporsional dengan ukuran masing-masing tabel seperti proporsional ke n1 ^ 1 atau n1 ^ 2 ... di mana n1 adalah jumlah baris dalam tabel 1.

Ini adalah kueri dengan 2 kiri bergabung

select EC.*,DPD.* from Table1 eC left join
  (
   select member_id,parent_gid,child_gid,LOB,group_gid,MAX(table2_sid) mdsid from Table2
   group by member_id,parent_gid,child_gid,LOB,group_gid

  ) DPD2 on DPD2.parent_gid = Ec.parent_gid
        AND DPD2.child_gid = EC.child_gid
        AND DPD2.member_id = EC.member_id
        AND DPD2.LOB = EC.default_lob
        AND DPD2.group_gid = EC.group_gid
  left join
  Table2 dpd on dpd.parent_gid = dpd2.parent_gid 
            and dpd.child_gid = dpd2.child_gid
            and dpd.member_id = dpd2.member_id 
            and dpd.group_gid = dpd2.group_gid 
            and dpd.LOB = dpd2.LOB
            and dpd.table2_sid = dpd2.mdsid

Ini adalah query dengan outer apply

select * from Table1 ec   
OUTER APPLY (
      select top 1 grace_begin_date,retroactive_begin_date,Isretroactive
                    from Table2 DPD 
                    where DPD.parent_gid = Ec.parent_gid
                    AND DPD.child_gid = EC.child_gid
                    AND DPD.member_id = EC.member_id
                    AND DPD.LOB = EC.default_lob
                    AND DPD.group_gid = EC.group_gid
                    order by DPD.table2_sid desc
     ) DPD 
Pratyush Dhanuka
sumber

Jawaban:

44

Adakah yang bisa tahu bagaimana sebenarnya berlaku bekerja dan bagaimana itu akan mempengaruhi kinerja dalam data yang sangat besar

APPLYadalah gabungan yang terkait (disebut LATERAL JOINdalam beberapa produk dan versi terbaru dari Standar SQL). Seperti konstruksi logis apa pun, itu tidak memiliki dampak langsung pada kinerja. Pada prinsipnya, kita harus dapat menulis kueri menggunakan sintaks yang setara secara logis, dan pengoptimal akan mengubah input kita menjadi rencana eksekusi fisik yang persis sama.

Tentu saja, ini membutuhkan pengoptimal untuk mengetahui setiap transformasi yang mungkin, dan memiliki waktu untuk mempertimbangkan masing-masing. Proses ini mungkin memakan waktu lebih lama dari usia alam semesta saat ini, sehingga sebagian besar produk komersial tidak menggunakan pendekatan ini. Oleh karena itu, sintaks kueri dapat, dan seringkali memang, berdampak pada kinerja akhir, meskipun sulit untuk membuat pernyataan umum tentang mana yang lebih baik dan mengapa.

Bentuk spesifik dari OUTER APPLY ( SELECT TOP ... )kemungkinan besar akan menghasilkan loop bersarang berkorelasi bergabung dalam versi SQL Server saat ini, karena pengoptimal tidak mengandung logika untuk mengubah pola ini menjadi setara JOIN. Loop bersarang yang terkait bergabung mungkin tidak berkinerja baik jika input luar besar, dan input dalam tidak terindeks, atau halaman yang dibutuhkan belum ada dalam memori. Selain itu, elemen spesifik dari model biaya pengoptimal berarti loop bersarang yang bergabung lebih kecil kemungkinannya daripada identik secara semantik JOINuntuk menghasilkan rencana eksekusi paralel.

Saya dapat membuat permintaan yang sama dengan gabungan kiri tunggal dan row_number ()

Ini mungkin atau mungkin tidak lebih baik dalam kasus umum. Anda perlu menguji kinerja kedua alternatif dengan data yang representatif. The LEFT JOINdan ROW_NUMBERpasti memiliki potensi untuk menjadi lebih efisien, tapi itu tergantung pada tepat bentuk rencana permintaan yang dipilih. Faktor utama yang mempengaruhi efisiensi pendekatan ini adalah ketersediaan indeks untuk mencakup kolom yang dibutuhkan, dan untuk memasok pesanan yang dibutuhkan oleh PARTITION BYdan ORDER BYklausa. Faktor kedua adalah ukuran tabel. Yang efisien dan terindeks dengan baik APPLYdapat melakukan ROW_NUMBERdengan pengindeksan yang optimal jika kueri menyentuh sebagian kecil dari tabel yang bersangkutan. Diperlukan pengujian.

Paul White mengatakan GoFundMonica
sumber
2

Kueri pertama dapat berjalan paralel dengan hanya satu permintaan ke server sql. Itu mengambil semua catatan dan memberikan output berdasarkan kriteria filter.

Tetapi jika yang kedua dijalankan baris demi baris dan untuk setiap baris Table2 akan dipindai dan ditambahkan hasilnya.

jika kueri luar Anda memiliki lebih sedikit catatan maka Yang kedua lebih baik (OUTER BERLAKU). Tetapi jika permintaan pertama mungkin mendapatkan lebih banyak data maka Anda harus menggunakan yang pertama.

pengguna55424
sumber