Ist die Varchar-Größe in temporären Tabellen wichtig?

16

Bei meiner Frau gibt es eine Debatte darüber, nur varchar(255)für alle varcharFelder in temporären Tabellen in gespeicherten Prozeduren zu verwenden. Grundsätzlich möchte ein Camp 255 verwenden, da dies auch dann immer funktioniert, wenn sich die Definition ändert, und das andere Camp möchte die Größe in den Quelltabellen beibehalten, um potenzielle Leistungsverbesserungen zu erzielen.

Ist das Aufführungslager richtig? Gibt es noch andere Implikationen? Sie verwenden SQL Server.

Brian Nickel
quelle
Ich würde argumentieren, dass Sie vielleicht gar keine temporären Tabellen brauchen. Wofür werden sie verwendet? Wozu werden diese spezifischen Spalten verwendet, wenn sie benötigt werden? Werden sie in Verknüpfungen oder Vergleichen jeglicher Art verwendet? Sind einige der zugrunde liegenden Spalten nvarchar und nicht varchar?
Aaron Bertrand
@AaronBertrand Die temporären Tabellen dienen der Modularität. Daten werden basierend auf Geschäftsregeln, die sich möglicherweise ändern, mehrmals transformiert und aufgefüllt. Ich denke, es gibt auch einige MAX()in der Mischung.
Brian Nickel

Antworten:

6

Je nachdem, wie Sie Ihre temporären Tabellen verwenden, kann es zu einem Problem mit der Datenkürzung kommen.

Dieses Beispiel ist ein bisschen erfunden, aber es illustriert meinen Standpunkt. Beispiel:

  1. Ihre Benutzertabellenspalte ist varchar (50).
  2. Ihre temporäre Tabellenspalte ist varchar (255).
  3. Sie haben einen Datensatz mit 45 Zeichen in dieser Spalte in Ihrer Benutzertabelle.
  4. In Ihrer Prozedur verketten Sie '- for the win' bis zum Ende dieser Spalte, bevor Sie diese temporäre Tabelle in Ihre Benutzertabelle einfügen.

Die temporäre Tabelle würde gerne den neuen varchar-Wert mit einer Länge von 59 akzeptieren. Ihre Benutzertabelle konnte dies jedoch nicht. Je nachdem, wie Sie in Ihrer Prozedur damit umgehen, kann dies zu Kürzungen oder Fehlern führen.

Sofern Sie diese Probleme nicht dokumentieren und berücksichtigen, kann Ihr Vorgang auf unerwartete Weise ausgeführt werden.

Ich persönlich glaube nicht, dass es zu 100% eine richtige Antwort auf diese Frage gibt. Es hängt wirklich davon ab, wie Sie diese temporären Tabellen verwenden.

Hoffe das hilft

Matt M
quelle
0

Verwenden varchar(255)für alle varcharFelder in temporären Tabellen in gespeicherten Prozeduren.

Ich würde mich zur Verwendung der tatsächlichen Feldlänge neigen.

Ich habe kürzlich gelesen, dass MySQL-temporäre Tabellen (ich gehe davon aus, dass SQL Server ähnlich ist) genügend Speicher zuweisen, um die maximal mögliche Länge für jede varcharSpalte zu speichern ... Ein systematischer Ansatz, um 200% -500% des erforderlichen Speichers für varcharFelder insgesamt zuzuweisen gespeicherte Prozeduren scheinen eine unnötige Beanspruchung der Systemressourcen zu sein. Wenn Sie beim Erstellen dieser temporären Tabellen jemals eine erhebliche Menge an Arbeitsspeicher verwenden, können Sie unnötigerweise Arbeitsspeicher beanspruchen, der zum Zwischenspeichern verwendet wurde, und zu einem späteren Zeitpunkt mehr Arbeit für den Server erstellen, selbst nachdem die Speicherprozeduren abgeschlossen sind.

Bearbeiten: Siehe die Antwort von Bill Karwin: /programming/1962310/importance-of-varchar-length-in-mysql-table

Matt
quelle
2
Angenommen, SQL Server ist ähnlich? Ich würde nicht ...
AK
Entschuldigung, mir ist klar, dass meine Antwort unvollständig ist. Was ich damit meine, ist, dass ich auf Nummer sicher gehen würde (dh keine Änderung vornehmen, die sich negativ auf die Leistung auswirken könnte), es sei denn, diese Annahme hat sich als falsch erwiesen.
Matt