Announcement

Collapse
No announcement yet.

Nachteile bei größerem Feld varchar?

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

  • Nachteile bei größerem Feld varchar?

    Hallo,

    gab's hier im Forum nicht mal eine Rubrik Datenbanken? Irgendwie ist mir so. Naja, dann poste ich mal hier ...

    Ich habe eine Tabelle (SQL Server 2000), die relativ alt ist und nun im Zuge der Einführung einer neuen Software in eine neue Struktur resp. Tabelle überführt werden soll. In der alten gibt es ein Feld mit dem Datentyp text, dieses möchte ich gern nach varchar(500) übernehmen (habe gelesen, dass text nicht mehr zeitgemäß ist und auch demnächst nicht mehr angeboten werden soll). Allerdings gibt es einige Sätze, bei denen in diesem Feld bis zu 3000 Zeichen stehen. Diese Infos sollen nicht verloren gehen.

    Ich habe meines Erachtens nach jetzt zwei Möglichkeiten:

    1. Ich versuche, die längeren Texte aufzusplitten und in mehrere Positionen aufzuteilen. Sieht nicht sehr schick aus, beträfe aber nur die älteren Vorgänge. Alle mit der neuen Software erstellten Vorgänge beträfe es nicht. Und es müßte eigentlich immer noch recht performant sein.

    2. Ich nutze einfach ein deutlich größeres varchar-Feld, eben zb. varchar(3000). Nur hier weiß ich nicht, wo die Nachteile liegen. Ich vermute nur, dass es sie gibt. Dieser Platz würde von einem Minimum der Sätze benötigt, wie verhält es sich dann mit dem Speicherplatzverbrauch? Welche Einbußen muss ich in der Performance hinnehmen (auch und gerade bei einer LIKE-Abfrage)?

    Ich nehme mal an, alles ist besser als text, aber wenn ich es schon neu mache, würde ich es natürlich auch gern richtig machen.
    Ich bin für jeden Tip oder Hinweis dankbar ...

    Dave

  • #2
    Originally posted by Dave_Bowman View Post
    In der alten gibt es ein Feld mit dem Datentyp text, dieses möchte ich gern nach varchar(500) übernehmen (habe gelesen, dass text nicht mehr zeitgemäß ist und auch demnächst nicht mehr angeboten werden soll).
    Quelle? Wüsste nicht wieso man das abschaffen sollte.


    text-Elemente werden "außerhalb" der eigentlichen Tabellenrow gespeichert so das dort die vom MS SQL Server bekannte 8060 Byte-Grenze pro Row nicht gilt. Erst neuere MS SQL Server-Versionen können auch varchars "außerhalb" der eigentlichen DB-Row speichern.

    zu 1: Und wieso das Willst du dann in der Oberfläche Felder "Kommentar1", "Kommentar2", ... anbieten?

    zu 2: Bedenke die 8060er Grenze beim MS SQL Server? Speicherplatzverbrauch wird die DB schon entsprechend optimieren (solange varchars verwendet werden).

    Willst du Text suchen so solltest du dir möglichkeiten des Servers bezüglich Volltextsuche anschauen.

    Comment


    • #3
      Originally posted by Bernhard Geyer View Post
      Quelle? Wüsste nicht wieso man das abschaffen sollte.
      Zum Beispiel hier: http://msdn.microsoft.com/de-de/library/ms187993.aspx

      Es handelt sich um eine normale Auftragspositionen-Tabelle, und in der Beschreibung z.B. eines Artikels werden auch zum Teil umfangreiche technische Angaben gemacht, die eben so ein 200-Zeichen-Feld bei weitem sprengen. Aber die sind, im Vergleich zur durchschnittlichen Länge, eher selten, müssen aber irgendwie mit rübergenommen werden.

      Mir fehlt leider (noch) das nötige Wissen zum SQL-Server. Was passiert denn, wenn man diese 8060er Grenze überschreitet? Betrifft dies nur SQL server 2000 oder auch spätere Versionen? Und wie bekomme ich raus, wo ich da jetzt liege (Spaltenverbrauch zusammenzählen, nehme ich mal an)? Und sehe ich das richtig, dass alles unterhalb dieser Grenze kein Problem darstellt?
      Naja, andererseits, selbst bei einem 3000-Feld ist es ja noch ein ganzes Stück hin bis 8000.

      Comment


      • #4
        Ok. text entspricht soweit ich das sehe varchar(max). Ist also vermutlich Anwendungstechnisch kein Unterschied.

        Comment


        • #5
          Code:
          Naja, andererseits, selbst bei einem 3000-Feld ist es ja noch ein ganzes Stück hin bis 8000.
          Nicht wenn du 3 Spalten davon in deiner Tabelle hast. Die 8060 Bytes sind eine Grenze für die gesamte Row nicht nur für eine Spalte in der Row.

          Du solltest die Umstellung von text auf varchar/nvarchar erst machen wenn du auf ein aktuelles Produkt umstellt. Also erst dann wenn auch eine Alternative zu text, eben varchar(max), möglich ist.

          Comment


          • #6
            Microsoft:

            Will VARCHAR(MAX), NVARCHAR(MAX) and VARBINARY(MAX) replace TEXT, NTEXT and IMAGE data types?

            Yes, VARCHAR(MAX), NVARCHAR(MAX) and VARBINARY(MAX) will replace the TEXT, NTEXT and IMAGE data types, respectively. TEXT, NTEXT and IMAGE data types will be removed in the future version of Microsoft SQL Server. Avoid using these data types when using SQL Server 2005 and use VARCHAR(MAX), NVARCHAR(MAX) and VARBINARY(MAX) instead.

            Comment

            Working...
            X