Announcement

Collapse
No announcement yet.

Varchar(max) als Standard-Stringtyp?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Varchar(max) als Standard-Stringtyp?

    Hallo,

    ich frage mich gerade, ob es nicht vorteilhaft ist, alle Strings als Varchar(max) zu definieren. Dann gäbe es keine Probleme mehr mit unterschiedlich lang definierten Strings und evt. unerwünschtem Abschneiden bei inserts.

    Hat varchar(max) irgendwelche Nachteile? Wenn nicht, wozu braucht man dann noch sowas wie varchar(10) ?

    Gruß
    Ingo

  • #2
    z.B. wenn ein Feld definitiv nur mi 10 Byte gefüllt werden darf (z.B. Teilenummer in führenden ERP-System). Dann wäre es von vorteil das auch bei Programmfehlern schon die DB diese einfache Längenprüfung durchführt.

    Manche Datenbanken nehmen für Indize die gesamte Länge eines Feldes her und füllen nicht verwendete Zeichen mit Füllzeichen um einfacher und schneller mit dem Index arbeiten zu können. Falls sowas auch intern beim MS SQL Server gemacht wird, würde der Index sehr groß werden.

    Bedenke auch das der MS SQL Server für alle (!) Nicht-Blob-Felder maximal 8060 Bytes in einem Record verwalten kann. Du kannst zwar munter varchar(max) definieren aber sie nicht alle komplett füllen.

    Comment


    • #3
      Varchar(max) als Standard String

      Hallo Bernhard ,

      soviel ich weiss, werden varchar Spalten nicht auf eine bestimmte Länge vom SQL Server aufgefüllt, auch nicht, wenn sie als Index verwendet werden.
      Vermutlich stimmt es aber, dass Spalten fester Länge schneller sind.
      Ich gedachte varchar(max) jedoch als Ersatz für andere varchar(n) Spalten zu verwenden, so dass die Geschwindigkeit sich erstmal nicht verschlechtern sollte.
      Evt. vorgeschriebene Längenbereiche ließen sich evt. durch CHECK constraints definieren. Das wäre dann auch flexibler, da Ober- und Untergrenzen angebbar wären und nicht nur die Obergrenze wie bei varchar(n). Bei Verstößen gegen ein CHECK constraint bekommt man auch aussagekräftige Fehlermeldung und nicht nur ein lapidares "... some value has been truncated...".

      Gruß
      Ingo

      Comment


      • #4
        Wenn ich mich jetzt nicht irre, dann sieht das so aus:
        varchar() mit einer Längenangabe wird mit den anderen Daten im gleichen Record gespeichert, der eine Gesamtgröße von 8060 nicht überschreiten darf/kann, wobei man aber zwei varchar()-Strings mit je 8000 Zeichen definieren kann und dann könnten entweder einer mit 8000 Zeichen gefüllt sein und der andere leer oder beide mit je 4000 Zeichen, ...
        Bei varchar(max) hingegen wird im Record nur mehr ein Pointer gespeichert und der String selber liegt ausserhalb und muss mit einem eigenen Zugriff eingelesen werden. Das kostet Zeit und drückt die Performance. Dafür aber gibt es keine Beschränkungen und man könnte auch 20 varchar(max)-Strings mit je 1 GB Text in einem einzigen Record speichern.
        Varchar(max) ist also TEXT, nur mit der Möglichkeit, jetzt alle Stringoperationen von varchar() verwenden zu können, was bei TEXT ja nicht möglich war. Varchar(max) ist daher die langsamste aller Stringvarianten, aber dafür die flexibelste.

        bye,
        Helmut

        Comment


        • #5
          Ist varchar(max) in SP Parametern von Nachteil?

          Danke Helmut. Das war klar und plausibel. Wie sieht es jedoch aus, wenn man varchar(max) als Typ in Stored Procedure Parametern verwendet? Könnte man so an dieser Stelle die truncate-Problematik umgehen, ohne ineffizient zu werden?

          Gruß
          Ingo

          Comment


          • #6
            Gute Frage. Kann ich dir aber nicht beantworten, da ich hier weder die technischen Internas kenne, wie varchar(max) als Parameter gehandhabt wird, noch habe ich da irgendwelche praktischen Erfahrungen. Aber vielleicht kannst du es mal selber mit verschieden großen Strings ausprobieren und das Ergebnis dann hier posten - ich, und sicher auch andere, wären schon gespannt ...

            bye,
            Helmut

            Comment

            Working...
            X