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?
COLLATE
nur 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
COLLATE Latin1_General_BIN2
macht den Ausdruck aufchecks.name
unantastbar. Für Ihre spezifische Abfrage sind Sie sich jedoch nicht sicher, inwieweit sich dies auf die Kardinalitätsschätzungen auswirkt.