Im folgenden Beispiel sind die Prädikate identisch, jedoch gibt die obere Anweisung (korrekt) 0 Zeilen zurück, die untere Anweisung 1 - obwohl die Prädikate NICHT übereinstimmen:
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
Warum könnte das passieren?
Weitere Infos:
- Der nicht gruppierte Index in der obersten Anweisung wird NICHT gefiltert
- CheckDB gibt 0 Probleme zurück
- Serverversion:
Microsoft SQL Azure (RTM) - 12.0.2000.8 Dec 19 2018 08:43:17 Copyright (C) 2018 Microsoft Corporation
Fügen Sie den Plan-Link ein:
https://www.brentozar.com/pastetheplan/?id=S1w_rU68E
Weitere Infos:
Sind gelaufen, dbcc checktable ([transaction]) with all_errormsgs, extended_logical_checks, data_purity
was auf keine Probleme hinweist.
Ich kann das Problem anhand dieser Tabelle zuverlässig reproduzieren, wenn eine Sicherung dieser Datenbank wiederhergestellt wird.
sql-server
azure-sql-database
columnstore
Uberzen1
quelle
quelle
Antworten:
Für diesen Fehler müssen keine Spalten gelöscht oder umbenannt werden.
Sie werden auch das gleiche Verhalten sehen, für
statusId = 100
das in keiner Version der Spalte etwas vorhanden war.Bedarf
Beispiel
Eine der folgenden Möglichkeiten vermeidet den Fehler:
= NULL
db <> Geigen- Demo.
Dieser Fehler wurde festgelegt in WE 15 für SQL Server 2017 (und CU7 für SQL Server 2016 SP2):
UPDATE: Abfragen für Tabellen mit Clustered Columnstore-Index und Nonclustered Rowstore-Index können in SQL Server 2016 und 2017 zu falschen Ergebnissen führen
quelle
Dies ist ein Fehler mit SQL Server. Wenn eine Spalte aus einer Tabelle mit einem Clustered Columnstore-Index gelöscht wird und dann eine neue Spalte mit demselben Namen hinzugefügt wird, wird anscheinend die alte, gelöschte Spalte für das Prädikat verwendet. Hier ist die MVCE:
Dieses Skript beginnt mit
10000
Zeilen mitstatusId
von1
undstatusId2
von5
- löscht dann diestatusID
Spalte und benennt siestatusId2
in umstatusId
. Am Ende sollten alle Zeilen einestatusId
5 haben.Die folgende Abfrage trifft jedoch den nicht gruppierten Index ...
... und gibt
2
Zeilen zurück (wobei sich die AuswahlstatusId
von der in derWHERE
Klausel implizierten unterscheidet ) ...... während dieser auf den Spaltenspeicher zugreift und korrekt zurückgibt
0
MVCE
Ich habe auch ein Problem im Azure-Feedback-Portal angesprochen :
Und für alle anderen, die darauf stoßen, behebt die Neuerstellung des Clustered Columnstore-Index das Problem:
Durch die Neuerstellung der CCI werden nur vorhandene Daten repariert. Wenn neue Datensätze hinzugefügt werden, tritt das Problem bei diesen Datensätzen erneut auf. Derzeit besteht die einzige bekannte Lösung für die Tabelle darin, sie vollständig neu zu erstellen.
quelle
and id2 = @id2
sollte Null Reihen sowieso garantieren wie@id2
istnull
aber immer noch den 2 bekommenREORGANIZE WITH (COMPRESS_ALL_ROW_GROUPS = ON);
den Job? Dadurch wird der Deltastore gelöscht. Tritt das Problem weiterhin bei neuen Zeilen auf, die anschließend hinzugefügt werden?Basierend auf den Plänen scheint der Columnstore-Index mit SET ANSI_NULLS OFF erstellt worden zu sein. Tabellen und Indizes behalten die Einstellung bei, als der Index erstellt wurde. Sie können dies überprüfen, indem Sie einen doppelten Columnstore-Index erstellen und gleichzeitig sicherstellen, dass ANSI_NULLS aktiviert ist, und dann entweder das Original löschen oder deaktivieren.
Sofern Sie keinen SQL Server-Fehler entdeckt haben, können die Ergebnisse nur so erzielt werden.
quelle