Die Typkonvertierung im Ausdruck kann sich auf "CardinalityEstimate" bei der Auswahl des Abfrageplans auswirken.

10

Ich verwalte eine Archivdatenbank, in der historische Daten in partitionierten Ansichten gespeichert werden. Die Partitionierungsspalte ist eine Datums- / Uhrzeitangabe. In jeder Tabelle unter der Ansicht werden Daten für einen Monat gespeichert.

Wir beschränken die Ereignisse für jede Tabelle mit einer Prüfbeschränkung für die datetime-Spalte. Auf diese Weise kann der Optimierer die Tabellen einschränken, die nach Abfragen durchsucht werden, die in der Spalte "Datum / Uhrzeit des Ereignisses" gefiltert werden.

Die Namen der Prüfeinschränkungen wurden von SQL Server generiert, daher ist es schwierig zu erkennen, was sie tun, wenn Sie sich ihren Namen ansehen.

Ich möchte, dass die Einschränkungsnamen die Form 'CK_TableName_Partition' haben.

Mit dieser Abfrage kann ich ein Umbenennungsskript erstellen und Daten aus der Spalte sql_text kopieren. Die WHERE-Klausel entspricht Prüfeinschränkungen, deren Namen so aussehen, als wären sie von SQL Server generiert worden:

SELECT
  checks.name AS check_name,
  tabs.name AS table_name,
  skemas.name AS schema_name,
  cols.name AS column_name,
  N'
EXECUTE sys.sp_rename
  @objname = N''' + skemas.name + N'.' + checks.name + N''',
  @newname = N''CK_' + tabs.name + N'_Partition'',
  @objtype = ''OBJECT'';' AS sql_text
FROM sys.check_constraints AS checks
INNER JOIN sys.tables AS tabs ON
  tabs.object_id = checks.parent_object_id
INNER JOIN sys.schemas AS skemas ON
  skemas.schema_id = tabs.schema_id
INNER JOIN sys.columns AS cols ON
  tabs.object_id = cols.object_id AND
  cols.column_id = checks.parent_column_id
WHERE checks.name LIKE (
  N'CK__' + SUBSTRING(tabs.name, 1, 9) +
  N'__' + SUBSTRING(cols.name, 1, 5) +
  N'__' + REPLACE(N'xxxxxxxx', N'x', N'[0-9A-F]') COLLATE Latin1_General_BIN2
)
ORDER BY table_name;

Die Ausgabe sieht folgendermaßen aus:

check_name  table_name  schema_name column_name sql_text
CK__tbAcquisi__Acqui__5C4299A5  tbAcquisitions_201301   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__5C4299A5',  @newname = N'CK_tbAcquisitions_201301_Partition',  @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__76026BA8  tbAcquisitions_201302   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__76026BA8',  @newname = N'CK_tbAcquisitions_201302_Partition',  @objtype = 'OBJECT';
CK__tbAcquisi__Acqui__7D6E8346  tbAcquisitions_201303   Archive AcquisitionDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbAcquisi__Acqui__7D6E8346',  @newname = N'CK_tbAcquisitions_201303_Partition',  @objtype = 'OBJECT';
...
CK__tbRequest__Reque__60132A89  tbRequests_201301   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__60132A89',  @newname = N'CK_tbRequests_201301_Partition',  @objtype = 'OBJECT';
CK__tbRequest__Reque__1392CE8F  tbRequests_201302   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__1392CE8F',  @newname = N'CK_tbRequests_201302_Partition',  @objtype = 'OBJECT';
CK__tbRequest__Reque__1AFEE62D  tbRequests_201303   Archive RequestDT   EXECUTE sys.sp_rename  @objname = N'Archive.CK__tbRequest__Reque__1AFEE62D',  @newname = N'CK_tbRequests_201303_Partition',  @objtype = 'OBJECT';

Das Ergebnis der Abfrage scheint korrekt zu sein und wird vom Server schnell ausgeführt.

Der Stammknoten des Ausführungsplans enthält jedoch eine Warnung:

Die Typkonvertierung im Ausdruck (CONVERT_IMPLICIT (nvarchar (128), [o]. [Name], 0)) kann sich auf "CardinalityEstimate" bei der Auswahl des Abfrageplans auswirken

Was bedeutet das in diesem Zusammenhang? Verwirrt ein so komplexer Filter den Optimierer? Ist es etwas, worüber ich mir Sorgen machen sollte?

Iain Samuel McLean Elder
quelle
2
Das COLLATE Latin1_General_BIN2macht den Ausdruck auf checks.nameunantastbar. Für Ihre spezifische Abfrage sind Sie sich jedoch nicht sicher, inwieweit sich dies auf die Kardinalitätsschätzungen auswirkt.
Martin Smith
2
Die binäre Unter der Annahme , COLLATEnur gibt es den Bereich Ausdruck Arbeit richtig zu machen könnten Sie ersetzen N'[0-9A-F]')mit N'[0123456789ABCDEF]'und die DropCOLLATE Latin1_General_BIN2
Martin Smith

Antworten:

16

Das Ergebnis der Abfrage scheint korrekt zu sein und wird vom Server schnell ausgeführt.

Der Stammknoten des Ausführungsplans enthält jedoch eine Warnung:

Die Typkonvertierung im Ausdruck (CONVERT_IMPLICIT (nvarchar (128), [o]. [Name], 0)) kann sich auf "CardinalityEstimate" bei der Auswahl des Abfrageplans auswirken

Was bedeutet das in diesem Zusammenhang? Verwirrt ein so komplexer Filter den Optimierer? Ist es etwas, worüber ich mir Sorgen machen sollte?

Die Warnung dient nur zur Information. Wenn Ihre Abfrage langsam ausgeführt wurde oder Sie bemerkten, dass die Kardinalitätsschätzungen falsch waren, gibt Ihnen die Warnung Informationen darüber, wo Sie nach einer möglichen Ursache suchen müssen.

Die Warnung wird durch die implizite Konvertierung ausgelöst, die für die Sortieränderung verwendet wird. Wenn die Verwendung der Sortierung der einfachste Weg ist, um korrekte Ergebnisse zu erzielen, können Sie sie unverändert lassen. Wenn Sie mehr darüber erklären, warum dies erforderlich ist, wird Sie alternativ von jemandem beraten.

Nebenbei REPLACEkönnte das ersetzt werden durch:

REPLICATE(N'[0-9A-F]', 8);

(Diese Antwort ist eine Zusammenfassung der Kommentare zur Frage.)

Paul White 9
quelle