IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

SQL Server 2012 : Indexes FILL_FACTOR


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut SQL Server 2012 : Indexes FILL_FACTOR
    Bonjour,

    est il possible d'avoir un FILL_FACTOR variable ? dans un même index ?

    Je m'explique:

    J'ai des données qui arrivent tout au long de la journée. Elle sont indexé sur la date + deux ou trois autres données.
    Au cour de la journées les données arrivent dans le désordre, donc il me faut un petit FILL_FACTOR.

    En revanche, à partir du lendemain les données sont dans le bon ordre et le FILL_FACTOR peut être à 100.

    Y-a-t il une solution ?

    Merci

  2. #2
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je vous cite la page MS sur le sujet :

    An explicit FILLFACTOR setting applies only when the index is first created or rebuilt. The Database Engine does not dynamically keep the specified percentage of empty space in the pages. For more information, see CREATE INDEX (Transact-SQL).

    To view the fill factor setting, use sys.indexes.
    En d'autre termes, à moins que vous ne fassiez du rebuild index, changer le fillfactor ne sert à rien.

    EDIT : et si vous faites du rebuild, rien ne vous empêche de spécifier à ce moment là quel fillfactor vous voulez utiliser.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    Je veux bien faire un rebuild de mes indexes pour remplis l'espace inutilisé, mais j'ai constamment besoin d'un FILL_FACTOR bas pour les nouvelle données...

    Concrètement je n'aimerais pas que ma table garde 50% d'espace vide dans des pages qui ne seront plus modifié si je met un FILL_FACTOR de 50.

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    C'est compréhensible. Certes le FILLFACTOR n'est utilisé qu'à la reconstruction d'un index, et il est évident qu'ensuite SQL Server remplit les pages de l'index autant que cela lui est possible.

    Pour adresser votre problème, vous pouvez avoir recours :

    - Si vous utilisez une édition Enterprise, au partitionnement de table. Dans votre cas, vous partitionnez suivant la date. On peut alors reconstruire un index sur une partition spécifique (attention cela se fait hors-ligne uniquement)

    - Si vous utilisez une autre édition ou que vous ne pouvez pas vous permettre de faire de la reconstruction d'index hors-ligne, alors il faudra opter pour une vue fédérée : vous aurez donc une table par jour. Il vous faut pour cela mettre une contrainte CHECK sur la colonne date de chacune des tables, de façon à ce que l'optimiseur de requête et le moteur de stockage n'aient pas besoin de parcourir toutes les tables pour savoir dans laquelle il faut lire ou écrire des données. Vous construisez ensuite dynamiquement par un job la nouvelle table et redéfinissez la vue qui est l'UNION ALL de toutes ces tables. Vous pouvez alors réaliser les lectures et écritures en spécifiant la vue. Dans ce cas, toutes les tables, excepté celles de la journée courante, ont un FILLFACTOR à 100. La table de la journée courante à un FILLFACTOR plus faible. L'avantage ici est que vous avez des statistiques de colonne et d'index au niveau journée, ce qui est plus fin, et peut procurer de meilleures performances.

    - Une solution alternative : vous avez une table partitionnée pour les lignes "d'archive", et une table en plus dans laquelle vous réalisez les écritures de la journée. Une vue vient là-dessus faire l'UNION ALL entre la table partitionnée et la table de la journée. Vous pouvez alors gérer le FILLFACTOR comme bon vous semble. Quand vous avez besoin d'archiver, vous réalisez une fusion de l'ex table du jour avec un ALTER TABLE ... SWITCH TO, après avoir créé la nouvelle table du jour.

    @++

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Points : 586
    Points
    586
    Par défaut
    Citation Envoyé par elsuket Voir le message
    - Une solution alternative : vous avez une table partitionnée pour les lignes "d'archive", et une table en plus dans laquelle vous réalisez les écritures de la journée. Une vue vient là-dessus faire l'UNION ALL entre la table partitionnée et la table de la journée. Vous pouvez alors gérer le FILLFACTOR comme bon vous semble. Quand vous avez besoin d'archiver, vous réalisez une fusion de l'ex table du jour avec un ALTER TABLE ... SWITCH TO, après avoir créé la nouvelle table du jour.
    Malheureusement j'ai une Standard 2012 et forcément besoin qu'elle soit UP 99% du temps ( Relation avec d'autres pays etc... ).

    J'ai de toute façon opter pour une solution proche de celle citée.
    Ou j'ai une table d'historique (archive ça fait peur par ici) et une table qui contient les 16 dernières semaines de données.

    Dans la table d'historique j'ai déjà un FILL_FACTOR à 100, mais c'est bien pour la petite table qui contient tout de même 1.8 mio lignes que je veux faire un peu de tuning car au feeling il me faudrait un FF entre 50 et 70.

    Notez que si il n'y a pas de solution je pourrais vivre avec.

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 896
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 896
    Points : 53 126
    Points
    53 126
    Billets dans le blog
    6
    Par défaut
    en pratique il est totalement déraisonnable de descendre en dessous de 75% de FF. En effet, déjà avec ce facteur votre index va grossir de l'ordre de 30% lors de la création. A 50 il double de volume.
    Personnellement je travaille avec des bases qui atteignent le milliard de ligne, et dans ces volumes là je ne descend jamais en dessous de 90%

    A +

Discussions similaires

  1. SQL Server 2012 : Défragmentation d'indexes
    Par Donpi dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 04/06/2012, 09h39
  2. SQL Server 2012 : exécuter Denali sans l’installer ?
    Par Hinault Romaric dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 09/01/2012, 12h03
  3. [Geek] Kinect et SQL Server 2012
    Par Ptit_Dje dans le forum MS SQL Server
    Réponses: 0
    Dernier message: 21/10/2011, 20h00
  4. SQL Server 2008 - index unique ou non unique ?
    Par drouhne dans le forum Administration
    Réponses: 3
    Dernier message: 12/10/2010, 15h45
  5. [SQL SERVER 2K] Index clustered et non clustered
    Par dens19 dans le forum Administration
    Réponses: 3
    Dernier message: 26/03/2009, 19h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo