Gibt es in SQL Server 2005 irgendwelche Nachteile, wenn man alle Zeichenfelder zu nvarchar(MAX) macht, anstatt explizit eine Länge anzugeben, z. B. nvarchar(255)? (Abgesehen von dem offensichtlichen Nachteil, dass man die Feldlänge nicht auf Datenbankebene begrenzen kann)
Antworten
Zu viele Anzeigen?Wenn alle Daten in einer Zeile (für alle Spalten) vernünftigerweise niemals 8000 oder weniger Zeichen umfassen würden, sollte der Entwurf auf der Datenebene dies erzwingen.
Die Datenbank-Engine ist viel effizienter, da sie alles aus dem Blob-Speicher heraushält. Je kleiner Sie eine Zeile einschränken können, desto besser. Je mehr Zeilen Sie auf einer Seite unterbringen können, desto besser. Die Datenbank arbeitet einfach besser, wenn sie auf weniger Seiten zugreifen muss.
Ich hatte ein udf, das Strings auffüllte und die Ausgabe in varchar(max) setzte. Wenn dies direkt verwendet wurde, anstatt auf die entsprechende Größe für die angepasste Spalte zurückzugreifen, war die Leistung sehr schlecht. Am Ende setzte ich die udf auf eine beliebige Länge mit einem großen Hinweis, anstatt mich darauf zu verlassen, dass alle Aufrufer der udf die Zeichenkette auf eine kleinere Größe zurückcasten.
Interessanter Link: Warum einen VARCHAR verwenden, wenn Sie TEXT verwenden können?
Es geht um PostgreSQL und MySQL, daher ist die Leistungsanalyse anders, aber die Logik der "Explizitheit" gilt immer noch: Warum sollte man sich ständig Gedanken über etwas machen, das nur zu einem geringen Prozentsatz relevant ist? Wenn Sie eine E-Mail-Adresse in einer Variablen speichern würden, würden Sie einen "String" und nicht einen "auf 80 Zeichen begrenzten String" verwenden.
Der größte Nachteil, den ich sehen kann, ist, dass Sie, sagen wir, dies haben:
Welche dieser Optionen gibt Ihnen die meisten Informationen über die für die Benutzeroberfläche benötigten Daten?
Diese
CREATE TABLE [dbo].[BusData](
[ID] [int] IDENTITY(1,1) NOT NULL,
[RecordId] [nvarchar](MAX) NULL,
[CompanyName] [nvarchar](MAX) NOT NULL,
[FirstName] [nvarchar](MAX) NOT NULL,
[LastName] [nvarchar](MAX) NOT NULL,
[ADDRESS] [nvarchar](MAX) NOT NULL,
[CITY] [nvarchar](MAX) NOT NULL,
[County] [nvarchar](MAX) NOT NULL,
[STATE] [nvarchar](MAX) NOT NULL,
[ZIP] [nvarchar](MAX) NOT NULL,
[PHONE] [nvarchar](MAX) NOT NULL,
[COUNTRY] [nvarchar](MAX) NOT NULL,
[NPA] [nvarchar](MAX) NULL,
[NXX] [nvarchar](MAX) NULL,
[XXXX] [nvarchar](MAX) NULL,
[CurrentRecord] [nvarchar](MAX) NULL,
[TotalCount] [nvarchar](MAX) NULL,
[Status] [int] NOT NULL,
[ChangeDate] [datetime] NOT NULL
) ON [PRIMARY]
Oder das?
CREATE TABLE [dbo].[BusData](
[ID] [int] IDENTITY(1,1) NOT NULL,
[RecordId] [nvarchar](50) NULL,
[CompanyName] [nvarchar](50) NOT NULL,
[FirstName] [nvarchar](50) NOT NULL,
[LastName] [nvarchar](50) NOT NULL,
[ADDRESS] [nvarchar](50) NOT NULL,
[CITY] [nvarchar](50) NOT NULL,
[County] [nvarchar](50) NOT NULL,
[STATE] [nvarchar](2) NOT NULL,
[ZIP] [nvarchar](16) NOT NULL,
[PHONE] [nvarchar](18) NOT NULL,
[COUNTRY] [nvarchar](50) NOT NULL,
[NPA] [nvarchar](3) NULL,
[NXX] [nvarchar](3) NULL,
[XXXX] [nvarchar](4) NULL,
[CurrentRecord] [nvarchar](50) NULL,
[TotalCount] [nvarchar](50) NULL,
[Status] [int] NOT NULL,
[ChangeDate] [datetime] NOT NULL
) ON [PRIMARY]