Freitag, Mai 03, 2013

Fillfactor im SQL Server

In Brent Ozars Blog erläutert Kendra Little die Bedeutung des Fillfactors im SQL Server. Grundsätzlich entspricht der Fillfactor in etwa der PCTFREE-Angabe für Oracle-Blocks, dient also dazu, Platz für spätere Einfügungen zu reservieren. Allerdings betrifft der Fillfactor nur Index-Strukturen, was insofern kein extreme Einschränkung ist, als der Index (in Form des Clustered Index) ja die Standard-Struktur zur Datenhaltung im SQL Server darstellt. Hier ein paar zusätzliche Stichpunkte (wie üblich ohne Anspruch auf Vollständigkeit):
  • der fill factor kann auf Instanzebene (sp_configure) oder für einen bestimmten Index gesetzt werden; die Angabe auf Instanzebene ist vermutlich nutzlos (weil viel zu allgemein)
  • er wird verwendet, um index page splits (des Typs 50:50) zu vermeiden, da diese schwach gefüllte pages hervorrufen (können)
  • vorgeschlagen wird eine "good index maintenance solution that checks index fragmentation and only acts on indexes that are fairly heavily fragmented". Rebuilds also nur in geeigneten Fällen.
  • der fill factor gilt nicht für heap Tabellen, aber mit denen hat man im SQL Server bekanntlich nicht allzu viel Freude.
  • der fill factor wirkt sich nicht auf neue pages aus, die am Ende des Index eingefügt werden (also im Fall von 99:1 splits)
  • der fill factor spielt keine Rolle für LOB pages
Insgesamt ist Frau Little eher skeptisch im Hinblick auf eine sinnvolle Verwendung des fill factor. Um ihn nutzbringend einzusetzen, muss man eine ziemlich klare Vorstellung von den Einfügeoperationen in den Index haben.

Kommentare:

  1. max_rows_per_page wirkt auch auf die Tabellen selbst.

    AntwortenLöschen
  2. Danke für die Ergänzung. BOL scheint zu dieser Option nicht (mehr?) viel zu sagen zu haben. Die Suchmaschine meines Vertrauens findet dafür hauptsächlich alte sysbase Treffer. Aber vom Namen her passt die Angabe natürlich ziemlich genau.

    AntwortenLöschen
  3. Du hast natuerlich Recht - diese Option gibt's nur bei Sybase. Ich bin faelschlicherweise davon ausgegangen, dass sie auch beim SQL Server vorhanden ist.

    AntwortenLöschen
  4. Sehr gut, danke. Genau nach dieser Informationen habe ich gesucht!
    Hast übrigens echt einen schönen Blog mit vielen nützlichen Informationen :-)

    AntwortenLöschen