Announcement

Collapse
No announcement yet.

numeric, decimal Speicherbedarf (SQL2005)

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

  • numeric, decimal Speicherbedarf (SQL2005)

    Hallo zusammen!

    Bin neu hier und auf der Suche nach ein paar Antworten auf eine Frage hier über dieses Forum gestolpert.

    Mich würde interessieren, wie es sich mit dem Speicherbedarf von numeric / bzw. decimal Werten verhält.

    Ich weis, das lt. MS Doku für den SQL Server 2005 ein decimal oder numeric Wert bei einer Genauigkeit bis 9 rund 5 Byte Speicherplatz benötigt.

    Im Detail:
    decimal (P,S)
    P == Genauigkeit
    S == davon dezimalstellen.

    Genauigkeit (P) | Speicherbedarf
    1-9 | 5byte
    10-19 | 9byte
    20-28 | 13byte
    29-38 | 17byte

    In unserer Datenbank haben wir eine Tabelle mit mehreren Millionen Einträgen.
    Da wir damals beim entwerfen nicht gleich auf Speicherplatzoptimierung geachtet haben, wollte ich (und habe schon zum Teil erfolgreich) hier den Speicherbedarf pro Zeile optimieren.
    (Aus Datetime -> smalldateime, int -> smallint, usw)
    Dies hatte mir einen erhebliche reduzierung des Speicherbedarfs der tabelle sowie der darauf liegenden Indizes gebracht.

    Nun wollte ich das gleiche auch für die Dezimalspalten tun. (es macht ja keinen Sinn eine Spalte, die maximal 4 Stellen haben kann mit 16 zu speichern).

    Nun ist es aber so, das diese Änderung der decimal Spalten keine Auswirkung auf die Größe der Daten in der Tabelle hat. Die Daten brauchen genau soviel Platz wie vorher.

    Ich habe folgendes Script dazu verwendet:

    ALTER TABLE xxx ALTER COLUMN zzz decimal(8,2) null

    (Also nicht über den Designer, sondern direkt per script).

    Kann es sein, das die tabelle komplett neu erstellt werden müsste, um hier tatsächlich auch einen Speicherplatzgewinn zu erzielen? (Der esignr würde das ja so machen)
    (Ich kann das leider nicht ganz so einfach ausprobieren, da die Datenbank in einer Replikation verwendet wird).

    MFG
    Josef Hietl

  • #2
    Hallo!

    Vllt hilft folgendes weiter:
    http://msdn.microsoft.com/de-de/libr...v=SQL.90).aspx

    Unter Beispiel P wird hier erwähnt, dass sobald Daten in der betroffenen Spalte vorhanden sind, die Größe nur noch erhöht werden kann.

    P. Ändern der Größe einer Spalte

    Im folgenden Beispiel werden die Größe einer varchar-Spalte und die Genauigkeit und Dezimalstellen einer decimal-Spalte erhöht. Da die Spalten Daten enthalten, kann die Spaltengröße nur erhöht werden. Beachten Sie auch, dass col_a in einem eindeutigen Index definiert wird. Die Größe von col_a kann weiter erhöht werden, da der Datentyp varchar ist und der Index nicht das Ergebnis einer PRIMARY KEY-Eischränkung ist.
    Kopieren
    Code:
    IF OBJECT_ID ( 'dbo.doc_exy', 'U' ) IS NOT NULL 
        DROP TABLE dbo.doc_exy;
    GO
    -- Create a two-column table with a unique index on the varchar column.
    CREATE TABLE dbo.doc_exy ( col_a varchar(5) UNIQUE NOT NULL, col_b decimal (4,2));
    GO
    INSERT INTO dbo.doc_exy VALUES ('Test', 99.99);
    GO
    -- Verify the current column size.
    SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
    FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
    GO
    -- Increase the size of the varchar column.
    ALTER TABLE dbo.doc_exy ALTER COLUMN col_a varchar(25);
    GO
    -- Increase the scale and precision of the decimal column.
    ALTER TABLE dbo.doc_exy ALTER COLUMN col_b decimal (10,4);
    GO
    -- Insert a new row.
    INSERT INTO dbo.doc_exy VALUES ('MyNewColumnSize', 99999.9999) ;
    GO
    -- Verify the current column size.
    SELECT name, TYPE_NAME(system_type_id), max_length, precision, scale
    FROM sys.columns WHERE object_id = OBJECT_ID(N'dbo.doc_exy');
    mfg

    Comment


    • #3
      ... die Größe nur noch erhöht werden kann.
      In dem Artikel steht:
      Die Länge, die Genauigkeit oder die Dezimalstellen einer Spalte können jedoch geändert werden, sofern der Datentyp nicht geändert wird.
      Die Genauigkeit kann auch nach unten geändert werden, sofern die vorhandenen Daten mit der Genauigkeit konvertiert werden können; das geht schon.

      Nur der Speicherplatz wird wirklich nicht frei gegeben, dazu muss man die Tabelle neu erstellen.
      Olaf Helper

      <Blog> <Xing>
      * cogito ergo sum * errare humanum est * quote erat demonstrandum *
      Wenn ich denke, ist das ein Fehler und das beweise ich täglich

      Comment

      Working...
      X