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 :

[2005] Partitionner table pour chaque valeurs de X


Sujet :

MS SQL Server

  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut [2005] Partitionner table pour chaque valeurs de X
    Bonjour,

    J'ai une table avec un champ entier qu'on n'a qu'à appeller X.
    J'aimerais savoir s'il m'est possible de faire une partition des lignes de cette table pour chaque valeur de X.

    Genre X = 156 => partition avec 13 lignes, X = 896 => parition avec 5 lignes, etc.

    Merci.
    Most Valued Pas mvp

  2. #2
    Membre actif
    Inscrit en
    Février 2009
    Messages
    224
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 224
    Points : 269
    Points
    269
    Par défaut
    Bonjour,
    tout d'abord le partitionnement de table ne sera efficace que dans le cas où votre table possède de très nombreuses lignes. Les exemples que vous citez sont très nettement insuffisant pour mettre en place un partitionnement.
    La fonction de partitionnement travail par plage de valeur, il est donc tout à fait possible de définir des partitions en fonctions de la valeur contenue dans le colonne X.
    + d'infos sur la fonction de partitionnement http://msdn.microsoft.com/fr-fr/library/ms187802.aspx

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Dans la doc, il est indiqué qu'il faut fournir une liste de valeur que pourrait atteindre X afin de crée les partitions (de plus cette liste est limitée à 999 valeurs).

    Moi, j'aurais une infinité de valeur.
    Je songe à la partition parce que jamais je n'aurai à faire d'opération (insert/delete/update/select...) sur cette table pour des colonnes ayant des X distinct.

    X représente vraiment l'isolation des groupes des lignes.
    Most Valued Pas mvp

  4. #4
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Même si vous n'avez pas d'opération de modification de données à faire sur ces parties de tables, le simple fait de les partitionner en autant de partition risque de vous faire perdre plus en lecture de métadonnées que le fait de modifier une table non partitionnée dont une grande partie n'est pas modifiée.
    Alexandre Chemla - Consultant MS BI chez Masao

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Pourtant quand je fais une oppération de suppression de toutes les lignes pour un même X, celle-ci est très coûteuse en process (peut-être parce que j'ai 2 indexes sur cette table).
    Most Valued Pas mvp

  6. #6
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Le partitionnenement de tables ne vaut que pour les très grosses bases de données en général lorsque la RAM ne suffit plus à contenur l'ensemble des données que l'on désire avec de gros traitements et lorsque meme la mise en place des index ne permet plus d'obtenir des performances satisfaisantes ou bien encore lorsque la moindre opération sur la table prend énormément de ressources et / ou de temps.

    Pourtant quand je fais une oppération de suppression de toutes les lignes pour un même X, celle-ci est très coûteuse en process (peut-être parce que j'ai 2 indexes sur cette table).
    Qu'appelez vous coûteuse en progress ? Quelle quantité de données ?
    Quelle est la DDL de votre table ? Sur quelle colonne et valeur voulez vous vraiment partitionner ?

    ++

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    IF NOT  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[tSubsetKey]') AND type in (N'U'))
    CREATE TABLE tSubsetKey
    (
    	packID INT NOT NULL
    	, memberID BIGINT NOT NULL
    	, CONSTRAINT PK_tSubsetKey PRIMARY KEY (packID, memberID)
    )
    GO
     
    IF NOT EXISTS (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'[dbo].[tSubsetKey]') AND name = N'IDX_memberID')
    CREATE INDEX IDX_memberID ON tSubsetKey(memberID)
    GO
    J'aimerais partitionner pour chaque packID.
    En général, groupées par packID j'ai environ 3000 lignes.

    À la supression, le processeur est utilisé à 100% pendant 1 à plusieurs secondes.
    Ce qui a pour conséquence, qu'en production notre serveur 4 cores est tout le temps à fond pendant les heures "de pointe".
    Most Valued Pas mvp

  8. #8
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Est ce que memberID doit obligatoirement être en BIGINT et est ce que vos recherches n'utilisent que pour seul prédicat la colonne memberID ou utilisez un prédicat avec les colonnes PackID et memberID ensemble ?

    ++

  9. #9
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Hélas je n'ai pas le choix quant au type de memberID (qui est donc BIGINT).
    J'utilise toujours packID comme principal critère de sélection et parfois memberID comme critère supplémentaire.
    Most Valued Pas mvp

  10. #10
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Si vous utilisez packID comme critère de recherche pour le delete, pourquoi n'existe-t-il pas d'index sur cette colonne ?
    Alexandre Chemla - Consultant MS BI chez Masao

  11. #11
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Ma clé primaire (indexe clustered) commence par le packID, donc nul besoin de rajouter un indexe pseudo redodant.
    Most Valued Pas mvp

  12. #12
    Membre chevronné Avatar de Jinroh77
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2006
    Messages
    1 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Février 2006
    Messages : 1 964
    Points : 2 145
    Points
    2 145
    Par défaut
    Désolé, lecture trop rapide de votre code, je n'avais pas lu la contrainte PK.
    Alexandre Chemla - Consultant MS BI chez Masao

  13. #13
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Hélas je n'ai pas le choix quant au type de memberID (qui est donc BIGINT).
    J'utilise toujours packID comme principal critère de sélection et parfois memberID comme critère supplémentaire.
    Donc vous n'avez pas besoin de l'index sur memberID. Vous pouvez le supprimer.

    Est ce que les opérations de suppression sont moins gourmandes après cela ?

    ++

  14. #14
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Je n'avais sans doute pas bien compris le contexte de votre précédente question.

    MemberID me sert dans bcp de jointures et l'index m'apporte à ce niveau un gain de vitesse appréciable.
    Most Valued Pas mvp

  15. #15
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    À la supression, le processeur est utilisé à 100% pendant 1 à plusieurs secondes.
    Ce qui a pour conséquence, qu'en production notre serveur 4 cores est tout le temps à fond pendant les heures "de pointe".
    Quelle est la volumetrie de votre table?
    En moyenne combien de lignes sont supprimées a la fois par transaction?
    Que montre l'execution plan de votre requete?
    Qu'est ce qu'il en est de la RAM libre?
    Qu'en est il des disques?
    Avez vous penser a monitorer les performances de votre serveur a "a plus long terme" afin de voir s'il ne faut pas le re-sizer?

  16. #16
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Je partage l'avis de Ptit_Dje.

    Il faudrait dans ce cas pouvoir monitorer les performances de votre serveur lors que votre requête s'exécute.

    La monopolisation des ressources processeurs est souvent liée à d'autres problèmes du serveur. Vous pouvez poser des compteurs sur la mémoire, l'activité des disques ,les process en jeu ainsi que l'activité processeur (activité en mode utilisateur et en mode noyau) pour comprendre ce qu'il se passe dans un 1er temps.

    ++

  17. #17
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Si je réponds à tout ça, vous m'expliquerez comment particionner ?
    Most Valued Pas mvp

  18. #18
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758

  19. #19
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Donc, tu ne sais pas.

    Tant pis, merci quand même.
    Most Valued Pas mvp

Discussions similaires

  1. Réponses: 3
    Dernier message: 17/11/2015, 00h03
  2. Requete avec limite pour chaque valeur du IN
    Par grunge0 dans le forum Requêtes
    Réponses: 4
    Dernier message: 29/09/2009, 14h00
  3. Réponses: 3
    Dernier message: 20/08/2009, 13h52
  4. utile de créer une table pour chaque utilisateur ?
    Par Overstone dans le forum Langage SQL
    Réponses: 6
    Dernier message: 22/03/2008, 14h37
  5. Réponses: 1
    Dernier message: 18/05/2005, 18h18

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