Dengan menggunakan contoh di bawah ini, predikatnya sama, namun pernyataan atas (dengan benar) mengembalikan 0 baris, pernyataan bawah mengembalikan 1 - meskipun predikat tidak cocok:
declare @barcode nchar(22)=N'RECB012ZUKI449M1VBJZ'
declare @tableId int = null
declare @total decimal(10, 2) = 5.17
SELECT 1
FROM
[dbo].[transaction] WITH (INDEX([IX_Transaction_TransactionID_PaymentStatus_DeviceID_DateTime_All]))
WHERE
Barcode = @barcode
AND StatusID = 1
AND TableID = @tableID
AND @total <= Total
SELECT 1
FROM
[dbo].[transaction]
WHERE
Barcode = @barcode
AND StatusID = 1
AND TableID = @tableID
AND @total <= Total
Mengapa ini bisa terjadi?
Info lebih lanjut:
- Indeks Non Clustered dalam pernyataan atas TIDAK disaring
- CheckDB mengembalikan 0 masalah
- Versi Server:
Microsoft SQL Azure (RTM) - 12.0.2000.8 Dec 19 2018 08:43:17 Copyright (C) 2018 Microsoft Corporation
Tempel tautan Rencana:
https://www.brentozar.com/pastetheplan/?id=S1w_rU68E
Info lebih lanjut:
Telah berlari dbcc checktable ([transaction]) with all_errormsgs, extended_logical_checks, data_purity
yang menunjukkan tidak ada masalah.
Saya dapat dipercaya mereproduksi masalah terhadap tabel ini ketika memulihkan cadangan database ini.
sql-server
azure-sql-database
columnstore
Uberzen1
sumber
sumber
Jawaban:
Bug ini tidak perlu menjatuhkan atau mengganti nama kolom
Anda juga akan melihat perilaku yang sama
statusId = 100
yang tidak pernah ada di versi kolom mana pun.Persyaratan
Contoh
Salah satu dari yang berikut ini akan menghindari bug:
= NULL
db <> demo biola .
Bug ini diperbaiki di CU15 untuk SQL Server 2017 (dan CU7 untuk SQL Server 2016 SP2):
MEMPERBAIKI: Permintaan terhadap tabel dengan kedua indeks kolomstore berkerumun dan indeks rowstore yang tidak tercakup dapat mengembalikan hasil yang salah di SQL Server 2016 dan 2017
sumber
Ini adalah bug dengan SQL Server. Jika sebuah kolom dihapus dari tabel dengan indeks kolomstore berkerumun, dan kemudian kolom baru ditambahkan dengan nama yang sama, itu tampaknya menggunakan kolom lama, dihapus untuk predikat. Inilah MVCE:
Script ini dimulai dengan
10000
baris denganstatusId
dari1
danstatusId2
dari5
- kemudian turunstatusID
kolom dan ganti namastatusId2
menjadistatusId
. Jadi pada akhirnya semua baris harus memilikistatusId
5.Tetapi kueri berikut mengenai indeks yang tidak berkerumun ...
... dan mengembalikan
2
baris (dengan yang dipilihstatusId
berbeda dari yang tersirat olehWHERE
klausa) ...... sedangkan yang ini mengakses toko kolom dan kembali dengan benar
0
MVCE
Saya juga telah mengangkat masalah pada portal umpan balik Azure :
Dan bagi siapa pun yang menjumpai ini, membangun kembali Clustered Columnstore Index memperbaiki masalah:
Membangun kembali CCI hanya memperbaiki data yang ada. Jika catatan baru ditambahkan, masalah muncul lagi pada catatan ini; jadi saat ini satu-satunya perbaikan yang diketahui untuk tabel adalah membuat ulang seluruhnya.
sumber
and id2 = @id2
harus menjamin nol baris tetap seperti@id2
ininull
tapi Anda masih mendapatkan 2REORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
berhasil? Itu akan menghapus deltastore - apakah masalah masih terjadi untuk baris baru yang ditambahkan setelah itu?Berdasarkan rencana, tampaknya indeks Columnstore dibuat dengan SET ANSI_NULLS OFF. Tabel dan indeks mempertahankan pengaturan seperti ketika indeks dibuat. Anda dapat memeriksa dengan membuat indeks Columnstore duplikat sambil memastikan bahwa ANSI_NULLS ON, lalu menjatuhkan yang asli atau menonaktifkannya.
Tapi, kecuali Anda telah menemukan bug SQL Server, ini adalah satu-satunya cara agar hasilnya bisa terjadi.
sumber