Ich habe dies kürzlich bei einigen Leistungstests bemerkt. Wenn ich einen Wert in eine Spalte einfüge, für die eine implizite Konvertierung erforderlich ist (z. B. bigint
in nvarchar
), wird eine Warnung angezeigt:
Die Typkonvertierung im Ausdruck
(CONVERT_IMPLICIT(nvarchar(50),[tempdb].[dbo].[#MyFunIntTable].[EvenCoolerColumn],0))
kann sich auf die "Kardinalitätsschätzung" bei der Auswahl des Abfrageplans auswirken.
Als besorgter Bürger überprüfte ich alle offensichtlichen Verdächtigen und griff schließlich in das XML ein, um zu bestätigen, dass es tatsächlich vor dem Einfügen in die Tabelle warnte. Das Problem ist, ich kann nicht herausfinden, warum dies jemals die Kardinalitätsschätzungen beeinflussen würde. Wenn ich dies in einem Join oder irgendwo mit etwas mehr Logik tun würde, wäre dies sinnvoll, aber es sollte keine Nichtübereinstimmung der Kardinalitätsschätzung für die eigentliche Einfügeoperation geben, oder?
Mir ist aufgefallen, dass dies passiert ist, wenn es sich um mehr als nur eine triviale Abfrage handelt. Sobald mehr als ein Wert eingefügt wird oder wir einen Wert aus einer Tabelle ziehen, treffen wir dies.
Diese Frage hat einige potenzielle Duplikate angezogen, darunter:
- Warum erhalte ich eine implizite Konvertierung von Int / Smallint in Varchar und wirkt sich dies wirklich auf die Kardinalitätsschätzungen aus?
- Die Typkonvertierung im Ausdruck kann sich auf "CardinalityEstimate" bei der Auswahl des Abfrageplans auswirken.
Ich denke, es unterscheidet sich von diesen Fragen, weil ich mit dieser Kolumne buchstäblich nichts mache. Ich verwende es nicht in einem Filter, einer Sortierung, einer Gruppierung, einem Join oder einer Funktion - all diese Dinge machen das Szenario komplizierter. Ich füge nur ein bigint
in ein ein nvarchar
, was sich niemals auf eine aussagekräftige Kardinalitätsschätzung auswirken sollte, die mir einfällt.
Was ich speziell aus einer Antwort heraus suche, ist:
- Eine Erklärung, warum ich diese Warnung erhalte, obwohl nichts Interessantes passiert - ist es nur so, dass SQL Server konservativ ist und Berichte erstellt, auch wenn dies keinen Einfluss auf die Planauswahl hat?
- Welche Kardinalitätsschätzung ist hier tatsächlich gefährdet, und welche Operation würde sich aufgrund von Ungenauigkeiten in dieser Kardinalitätsschätzung ändern?
- Gibt es ein Szenario, in dem dies die Planauswahl beeinflussen könnte? Wenn ich anfange, die konvertierte Spalte zu verbinden oder zu filtern, könnte dies natürlich der Fall sein, aber wie sie ist?
- Gibt es etwas, das getan werden kann, um eine Warnung zu verhindern, außer das Ändern von Datentypen (vorausgesetzt, dies ist eine Voraussetzung für die Interaktion der Datenmodelle)?
Ich habe es mit dem folgenden einfachen Beispiel neu erstellt ( Plan einfügen )
DROP TABLE IF EXISTS #MyFunStringTable;
DROP TABLE IF EXISTS #MyFunIntTable;
CREATE TABLE #MyFunStringTable
(
SuperCoolColumn nvarchar(50) COLLATE DATABASE_DEFAULT NULL
);
CREATE TABLE #MyFunIntTable
(
EvenCoolerColumn bigint NULL
);
INSERT INTO #MyFunIntTable
( EvenCoolerColumn )
VALUES
( 1 ),
( 2 ),
( 3 ),
( 4 ),
( 5 );
INSERT INTO #MyFunStringTable
( SuperCoolColumn )
SELECT EvenCoolerColumn
FROM #MyFunIntTable;
INSERT INTO #MyFunStringTable
( SuperCoolColumn )
VALUES
( 1 );
INSERT INTO #MyFunStringTable
( SuperCoolColumn )
VALUES
( 1 ),
( 2 );
INSERT INTO #MyFunStringTable
( SuperCoolColumn )
SELECT 1;
INSERT INTO #MyFunStringTable
( SuperCoolColumn )
SELECT 1
UNION ALL
SELECT 2;
INSERT INTO #MyFunStringTable
( SuperCoolColumn )
SELECT 1
FROM #MyFunIntTable;