Mengapa Operator Paralelisme (Aliran Ulang Partisi) Mengurangi Perkiraan Baris menjadi 1?

12

Saya menggunakan SQL Server 2012 Enterprise. Saya telah menemukan Paket SQL yang menunjukkan beberapa perilaku yang saya tidak menemukan sepenuhnya intuitif. Setelah operasi Pemindaian Indeks Paralel yang berat, operasi Paralelisme (Aliran Ulang Bagian) terjadi, tetapi membunuh perkiraan baris yang dikembalikan oleh Pemindaian Indeks (Object10.Index2), mengurangi estimasi menjadi 1. Saya telah melakukan pencarian, tetapi belum menemukan apa pun yang menjelaskan perilaku ini. Permintaannya cukup sederhana, meskipun masing-masing tabel berisi rekaman dalam jutaan yang rendah. Ini adalah bagian dari proses pemuatan DWH dan kumpulan data menengah ini disentuh beberapa kali, tetapi pertanyaan yang saya miliki terkait dengan perkiraan baris khususnya. Adakah yang bisa menjelaskan mengapa estimasi baris akurat menjadi 1 di dalam Operator Paralelisme (Partisi Ulang)? Juga,

Saya telah memposting paket lengkap untuk Tempelkan Paket .

Inilah operasi yang dimaksud:

masukkan deskripsi gambar di sini

Termasuk pohon rencana jika menambah konteks:

masukkan deskripsi gambar di sini

Mungkinkah saya mengalami beberapa variasi dari item Connect ini yang diajukan oleh Paul White (eksplorasi mendalam lebih lanjut di blog-nya di sini )? Setidaknya itu satu-satunya hal yang saya temukan yang tampaknya jauh dari apa yang saya temui meskipun tidak ada operator TOP yang bermain.

John Eisbrener
sumber

Jawaban:

9

Paket kueri dengan filter bitmap terkadang sulit untuk dibaca. Dari artikel BOL untuk aliran partisi ulang (penekanan milik saya):

Operator Repartition Streams mengkonsumsi beberapa stream dan menghasilkan beberapa stream dari record. Isi dan format rekaman tidak diubah. Jika pengoptimal kueri menggunakan filter bitmap, jumlah baris dalam aliran output berkurang.

Selain itu, artikel tentang filter bitmap juga membantu:

Saat menganalisis rencana eksekusi yang mengandung penyaringan bitmap, penting untuk memahami bagaimana data mengalir melalui rencana dan di mana penyaringan diterapkan. Filter bitmap dan bitmap yang dioptimalkan dibuat pada sisi input build (tabel dimensi) dari hash join; Namun, pemfilteran yang sebenarnya biasanya dilakukan dalam operator Paralelisme, yang ada di sisi input probe (tabel fakta) dari hash join. Namun, ketika filter bitmap didasarkan pada kolom bilangan bulat, filter dapat diterapkan langsung ke tabel awal atau operasi pemindaian indeks daripada operator Parallelism. Teknik ini disebut optimasi in-row.

Saya percaya itulah yang Anda amati dengan permintaan Anda. Dimungkinkan untuk membuat demo yang relatif sederhana untuk menunjukkan operator aliran partisi ulang mengurangi perkiraan kardinalitas, bahkan ketika operator bitmap IN_ROWmenentang tabel fakta. Persiapan data:

create table outer_tbl (ID BIGINT NOT NULL);

INSERT INTO outer_tbl WITH (TABLOCK)
SELECT TOP (1000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM master..spt_values;

create table inner_tbl_1 (ID BIGINT NULL);
create table inner_tbl_2 (ID BIGINT NULL);

INSERT INTO inner_tbl_1 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

INSERT INTO inner_tbl_2 WITH (TABLOCK)
SELECT (ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) / 2000000 - 2) NUM
FROM master..spt_values t1
CROSS JOIN master..spt_values t2;

Berikut adalah kueri yang tidak boleh Anda jalankan:

SELECT *
FROM outer_tbl o
INNER JOIN inner_tbl_1 i ON o.ID = i.ID
INNER JOIN inner_tbl_2 i2 ON o.ID = i2.ID
OPTION (HASH JOIN, QUERYTRACEON 9481, QUERYTRACEON 8649);

Saya mengunggah paket tersebut . Lihatlah operator di dekat inner_tbl_2:

partisi ulang kehilangan baris

Anda juga dapat menemukan tes kedua di Hash Joins on Nullable Columns oleh Paul White.

Ada beberapa inkonsistensi dalam bagaimana pengurangan baris diterapkan. Saya hanya bisa melihatnya dalam sebuah rencana dengan setidaknya tiga meja. Namun, pengurangan baris yang diharapkan tampaknya masuk akal dengan distribusi data yang tepat. Misalkan kolom yang tergabung dalam tabel fakta memiliki banyak nilai berulang yang tidak ada dalam tabel dimensi. Filter bitmap mungkin menghilangkan baris-baris itu sebelum mencapai gabungan. Untuk kueri Anda, estimasi dikurangi hingga 1. Bagaimana baris didistribusikan di antara fungsi hash memberikan petunjuk yang baik:

distro baris

Berdasarkan itu saya menduga Anda memiliki banyak nilai berulang untuk Object1.Column21kolom. Jika kolom berulang tidak berada dalam histogram statistik untuk Object4.Column19kemudian SQL Server bisa mendapatkan perkiraan kardinalitas yang sangat salah.

Saya pikir Anda harus khawatir karena mungkin untuk meningkatkan kinerja kueri. Tentu saja, jika permintaan memenuhi waktu respons atau persyaratan SLA maka mungkin tidak perlu diselidiki lebih lanjut. Namun, jika Anda ingin menyelidiki lebih lanjut, ada beberapa hal yang dapat Anda lakukan (selain memperbarui statistik) untuk mengetahui apakah pengoptimal kueri akan memilih paket yang lebih baik jika memiliki informasi yang lebih baik. Anda bisa memasukkan hasil gabungan antara Database1.Schema1.Object10dan Database1.Schema1.Object11ke dalam tabel temp dan lihat apakah Anda terus mendapatkan gabungan simpul bersarang. Anda bisa mengubah gabungan LEFT OUTER JOINitu menjadi pengoptimal kueri tidak akan mengurangi jumlah baris pada langkah itu. Anda bisa menambahkan MAXDOP 1petunjuk ke permintaan Anda untuk melihat apa yang terjadi. Anda bisa menggunakannyaTOPbersama dengan tabel turunan untuk memaksa bergabung untuk pergi terakhir, atau Anda bahkan dapat mengomentari bergabung dari kueri. Semoga saran-saran ini cukup untuk membantu Anda memulai.

Mengenai item hubungkan dalam pertanyaan, sangat kecil kemungkinannya terkait dengan pertanyaan Anda. Masalah itu tidak ada hubungannya dengan taksiran baris yang buruk. Ini berkaitan dengan kondisi ras dalam paralelisme yang menyebabkan terlalu banyak baris diproses dalam rencana kueri di belakang layar. Di sini sepertinya kueri Anda tidak melakukan pekerjaan ekstra.

Joe Obbish
sumber
6

Masalah inti di sini adalah estimasi kardinalitas yang buruk untuk hasil dari join pertama. Ini mungkin muncul karena banyak alasan, tetapi paling sering itu adalah statistik kedaluwarsa atau sejumlah predikat gabungan yang berkorelasi, yang diasumsikan model default pengoptimal itu independen.

Dalam kasus terakhir, PERBAIKI: Kinerja buruk ketika Anda menjalankan kueri yang berisi predikat berkorelasi DAN di SQL Server 2008 atau di SQL Server 2008 R2 atau di SQL Server 2012 mungkin relevan menggunakan jejak jejak yang didukung 4137. Anda juga dapat mencoba kueri dengan lacak flag 4199 untuk mengaktifkan perbaikan optimizer, dan / atau 2301 untuk mengaktifkan ekstensi pemodelan. Sulit diketahui berdasarkan rencana yang dianonimkan.

Kehadiran bitmap tidak secara langsung memengaruhi estimasi kardinalitas dari join, tetapi itu membuat efeknya terlihat lebih cepat dengan menerapkan reduksi semijoin awal. Tanpa bitmap, perkiraan kardinalitas untuk join pertama akan sama, dan sisanya dari rencana tersebut akan tetap dioptimalkan.

Jika Anda penasaran, pada sistem pengujian, Anda dapat menonaktifkan bitmap untuk kueri dengan jejak jejak 7498. Anda juga dapat menonaktifkan bitmap yang dioptimalkan (dipertimbangkan oleh pengoptimal dan memengaruhi perkiraan kardinalitas), menggantikannya dengan bitmap pasca-optimasi (tidak dipertimbangkan oleh pengoptimal, tidak ada efek pada kardinalitas) dengan kombinasi tanda jejak 7497 dan 7498. Tidak didokumentasikan atau didukung untuk digunakan pada sistem produksi, tetapi mereka menghasilkan rencana yang pengoptimal dapat mempertimbangkan secara normal, sehingga dapat dipaksa dengan panduan rencana.

Semua ini tidak akan menyelesaikan masalah inti dari perkiraan miskin untuk bergabung pertama seperti yang disebutkan di atas, jadi saya benar-benar hanya menyebutkannya demi kepentingan.

Bacaan lebih lanjut tentang bitmap dan hash bergabung:

Paul White 9
sumber
0

merespons Anda di Twitter. Saya melihat XML terlampir dan melihat paralelisme tidak seimbang. 1 utas memiliki hampir semua baris aktual sedangkan sebagian lainnya tidak. Jeritan paralelisme tidak seimbang sedang terjadi. Karena itu, saya akan melihat nilai kunci / gabungan dan statistik & kardinalitas masing-masing.

Menurut gagasan Anda yang lain, saya tidak begitu yakin bahwa item Sambungkan berlaku, karena paket yang Anda tempel tidak mengandung TOP di mana pun saya melihatnya.

SQLBek
sumber