Saat bekerja dengan C # Entity Framework saya melihat crash contoh SQL Server saya.
Saya dapat melacaknya ke pernyataan ini:
SELECT * FROM dbo.[TestTable]
where mpnr in (1099059904,
1038139906,
1048119902,
1045119902,
1002109903,
1117109910,
1111149902,
1063149902,
1117159902,
1116109904,
1105079905,
1012079906,
1129129904,
1103059905,
1065059905,
1091059906,
1110149904,
1129149903,
1083029905,
1080139904,
1076109903,
1010019902,
1058019902,
1060019903,
1053019902,
1030089902,
1018149902,
1077149902,
1010109901,
1011109901,
1000119902,
1023049903,
1107119909,
1108119909,
1106119909)
Tabelnya terlihat seperti ini:
CREATE TABLE dbo.[TestTable]([MPNR] [numeric](9, 0) NOT NULL)
Kecelakaan terjadi setiap kali saya memulai kueri. Jika saya mengurangi jumlah nilai dalam IN
klausa, itu berfungsi. (Tentu saja tidak mengembalikan baris.)
Saya sadar bahwa nilai-nilai dalam IN
klausa adalah angka 10-digit dan kolom hanya memiliki 9-digit, tetapi itu tidak menyebabkan crash seluruh contoh SQL Server.
Versi SQL Server saya adalah 2008 R2 pada Windows Server 2003 32-bit.
Apakah ini Bug yang dikenal? Apakah ada Patch untuk SQL Server?
sql-server
sql-server-2008-r2
crash
SteLoe
sumber
sumber
Jawaban:
Saya dapat repro pada 2008 R1 SP3 10.00.5512 tetapi menginstal CU terbaru (14) memperbaikinya.
Meninjau bug yang diperbaiki dalam versi intervensi sepertinya Anda perlu memutakhirkan ke versi yang menyertakan perbaikan berikut.
Pelanggaran akses saat Anda menjalankan kueri yang berisi banyak nilai konstan dalam klausa IN di SQL Server 2008 atau SQL Server 2012
Saat Anda menggunakan 2008 R2, Anda membutuhkan setidaknya CU 9 untuk SP1 atau CU 5 untuk SP2.
Deskripsi gejala agak singkat tetapi menyebutkan tipe data yang tidak cocok
Itu tidak mendefinisikan "banyak". Dari pengujian yang saya lakukan saya menduga ini mungkin berarti "20 atau lebih" karena ini tampaknya menjadi titik potong antara dua metode yang berbeda dalam memperkirakan kardinalitas.
Kecelakaan itu terjadi di dalam beberapa metode yang disebut
CScaOp_In::FCalcSelectivity()
dengan nama-nama sepertiLoadHistogramFromXVariantArray()
danCInMemHistogram::FJoin() -> WalkHistograms()
.Untuk 19 item yang berbeda atau lebih sedikit dalam daftar, metode ini tidak dipanggil sama sekali. Sebuah mirip SQL Sever 2000 bug juga menyebutkan cut ini off point yang signifikan.
Mengisi tabel uji dengan 100.000 baris data uji acak dengan nilai antara 0 dan 1047 dan histogram dimulai sebagai berikut
Kueri
Menampilkan baris yang diperkirakan pada 1856.
Inilah yang diharapkan dengan mendapatkan baris yang diperkirakan untuk 19 predikat kesetaraan secara individual dan menambahkannya bersama-sama.
Rumus tidak lagi berfungsi setelah
20
ditambahkan ke dalam daftar (Diperkirakan baris1902.75
daripada1952
yang menambahkan yang lain96
untuk total akan menghasilkan).BETWEEN
tampaknya masih menggunakan metode lain untuk menghitung perkiraan kardinalitas.where mpnr BETWEEN 1 AND 20
memperkirakan hanya 1.829,6 baris. Saya tidak tahu bagaimana itu diturunkan dari histogram yang ditampilkan.sumber