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

Administration SQL Server Discussion :

Index Columstore question


Sujet :

Administration SQL Server

  1. #1
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut Index Columstore question
    Bonjour a Tous

    Nous allons migrer la partie BI de SQL 2008 R2 a 2014

    J'avais des questions concernant les columstore :

    - Faut il indexer toutes les colonnes non-clustered ?
    - faut il remplacer les index clustered par ceux des index columstore

    Je dis ca car je fais des tests et c'est pas tres probant , je dois surement mal m'y prendre...

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Les index columnstore sont read only et dépendent de ce que vous voulez faire en matière de BI. Si votre DW est alimenté en scrtah and go alors c'est adapté. Si alimenté en différentiel alors éventuellement un index CLUSTERED COLUMNSTORE. Dans tous les cas il faut tester avec une vrai charge !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    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
    Hello,

    - Faut il indexer toutes les colonnes non-clustered ?
    - faut il remplacer les index clustered par ceux des index columstore
    Avec 2014, tu peux créer un index clustered columnstore donc toutes les colonnes seront incluses by design
    Donc soit tu auras un index clustered columnstore soit un index cluster classique


    Je dis ca car je fais des tests et c'est pas tres probant , je dois surement mal m'y prendre...
    Les index columnstore ne sont pas forcément adaptés à toutes les situations.
    Peux-tu préciser ton contexte, une requête et éventuellement un plan d'exécution dans une situation où le gain de performance n'est pas probant?

    ++

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Points : 674
    Points
    674
    Par défaut
    Je confirme que les index Columnstore ne sont pas toujours utile et n'ameliorent pas toujours les perf ...

    Il faut les utiliser dans certains cas, peux tu nous founir des exemples de cas d'utilisation ?

    Merci
    MCSA SQL SERVER |MCT | MVP Data Platform

  5. #5
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    ce n'est pas probant car une vue qui met normalement 3 minutes mets plus de 4 minutes apres la creation de l'index columstore non clustered sur la table :

    le nombre de pages lues avant la creation de l'index :

    Table 'TR_REGROUPEMENT_RGR'. Nombre d'analyses 7279402, lectures logiques 14558804, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lec

    Apres creation de l'index Columstore sur la meme colonne :

    Table 'TR_REGROUPEMENT_RGR'. Scan count 14667440, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 104, lob physical reads 0, lob read-ahead reads 0.
    Table 'TR_REGROUPEMENT_RGR'. Segment reads 7333720, segment skipped 0.

    Je precise qu'il y a un index clustered sur la table, mais qui n'est pas bien sur, sur la meme colonne

  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
    ce n'est pas probant car une vue qui met normalement 3 minutes mets plus de 4 minutes apres la creation de l'index columstore non clustered sur la table :
    J'imagine Mais ici pour t'aider il nous faudra plus d'information sur le contexte. Est-ce que déjà tu peux nous donner la requête que tu exécutes? Le plan d'exécution réel ?

    PS: Si tu utilises SQLSentry et que tes informations sont sensibles tu peux d'abord anonymer avant de nous le fournir.

    ++

  7. #7
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    ok ca marche et merci beaucoup de votre aide

    voici la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    SELECT 
    			 INC.INC_ID_CONTRAT as CON_IdContratKey
    			 ,CON.CON_ID_CONTRAT as REN_IdRenouvKey
    			 ,INC.INC_ID_ADHESION as CON_IdContrat
    			 ,CNT.CNT_CD_CENTRE as CEN_CodeCentre
    			 ,CON.CON_NUMERO as CON_NumContrat
    			 ,PRD.PRD_CD_PRODUIT as PRD_CodeProduit
    			 ,INC.INC_DT_SOUSCRIPTION as CON_DateAdhesion
    			 ,INC.INC_DT_REALISATION as CON_DateRealisation
    			 ,CON.CON_DT_DEBUT as CON_DateDebutContrat
    			 ,CON.CON_DT_FIN as CON_DateFinDeContrat
    			 ,CON.CON_DUREE_CONTRAT as CON_DureeContrat
    			 ,CASE WHEN SUBSTRING(CMB.CMB_RESULTAT, 1, 2) = 'OK' 
    			 THEN 'OK'
    			 ELSE CASE WHEN CMB.CMB_ID_CONTRAT IS null 
    			 THEN 'NA'
    			 ELSE 'KO' 
    			 END 
    			 END as CON_StatutAppelBienvenue
    			 ,CON.CON_TOP_TACITE as CON_TopTacite
    			 ,CONVERT(CHAR(6), INC.INC_DT_SOUSCRIPTION, 112) as CON_EcheanceCourante
    			 ,CON.CON_NB_LIGNE - 1 as ECH_NbrRenouvCourante
    			 ,CASE WHEN CON.CON_NB_LIGNE = 1 
    			 THEN '-' ELSE 'M' END
    			 as CON_TypeEcheanceCourante
    			 ,ISNULL(CNR.CNR_CODE,'-') as TRE_TypeRenouvCourante
    			 ,CONVERT(CHAR(6), INC.INC_DT_REALISATION, 112) as CON_AnneeMoisDeRealisation
    			 --,CASE WHEN CRB.CRB_ID_COORDONNEES_BANCAIRES IS NOT NULL AND RGP3.RGP_LIB ='Eligible AP-LIV'
    			 /*,CASE WHEN INC0.INC_TOP_RIB in ('1','T') -- 23/09/2015 
    									AND RGP3.RGP_LIB ='Eligible AP-LIV'
    			 THEN '1' ELSE '0' END CON_TopDossierComplet*/
    			 -- 11/04/2016 -- TFS7743 - Revoir flag DC dans ODS (Tacite ou Tacite à venir)
    			 ,CASE WHEN CON0.CON_TOP_TACITE in ('1','2','3','5') AND RGP3.RGP_LIB ='Eligible AP-LIV' THEN '1' ELSE '0' END CON_TopDossierComplet
    			 ,CASE RSV.RSV_LIB WHEN 'Vente à distance' THEN '1' ELSE '0' END CON_TopVD
    			 ,INC.INC_NUM_REF_GED as CON_NumStock
    			 ,RSV_LIB CON_ReseauVente
    			 ,CON0.CON_NUM_REF_GED
    			 ,CON0.CON_OPTION_VINCI
    			 ,CNC_CD_USER+CNC_TYPE_CONTACT Code_APPAFF
    FROM dbo.T_CONTRAT_CON CON with (nolock)
    INNER join T_CONTRAT_CON CON0 with (nolock)
     ON CON.INC_ID_CONTRAT=CON0.INC_ID_CONTRAT 
     and CON0.CON_NB_LIGNE=1
    INNER JOIN dbo.T_INFOS_CONTRAT_INC INC with (nolock)
     ON CON.INC_ID_CONTRAT = INC.INC_ID_CONTRAT 
     AND INC.INC_ID_ADHESION IS NOT NULL
    INNER JOIN dbo.T_INFOS_CONTRAT_INC INC0 with (nolock)
    	ON CON0.INC_ID_CONTRAT = INC0.INC_ID_CONTRAT 
    	AND INC0.INC_ID_ADHESION IS NOT NULL
    INNER JOIN T_PRODUIT_PRD PRD with (nolock)
     ON CON.PRD_ID_PRODUIT = PRD.PRD_ID_PRODUIT
    LEFT JOIN TJ_REGROUPEMENT_PRODUIT_RGP RGP3 with (nolock)
     ON PRD.PRD_ID_PRODUIT = RGP3.PRD_ID_PRODUIT
     AND RGP3.RGR_ID_REGROUPEMENT = (SELECT RGR_ID_REGROUPEMENT FROM TR_REGROUPEMENT_RGR WHERE RGR_ID_SOURCE='3')
    LEFT JOIN dbo.TR_CANAL_RENOUVELLEMENT_CNR CNR with (nolock)
     ON CON.CNR_ID_CANAL_RENOU = CNR.CNR_ID_CANAL_RENOU
    LEFT OUTER JOIN (
     SELECT distinct CMB.CMB_ID_CONTRAT, CMB.CMB_RESULTAT
     from adhexp.T_CAMPAGNE_BIENVENUE_CMB CMB with (nolock)
     join (
     select distinct CMB_ID_CONTRAT, MAX(CMB_DT_APPEL) as CMB_DT_APPEL
     from adhexp.T_CAMPAGNE_BIENVENUE_CMB with (nolock)
     group by CMB_ID_CONTRAT
     ) MCM
     on CMB.CMB_ID_CONTRAT = MCM.CMB_ID_CONTRAT
     and CMB.CMB_DT_APPEL = MCM.CMB_DT_APPEL
     ) CMB
     ON INC.INC_ID_ADHESION = CMB.CMB_ID_CONTRAT
    INNER JOIN dbo.TJ_CONTRAT_INDIVIDUS_CNI AS CNICENTRE with (nolock)
     ON CNICENTRE.CON_ID_CONTRAT = CON.INC_ID_CONTRAT
     AND CNICENTRE.CNI_TOP_DERNIER_ACTEUR_ROLE = '1'
     AND CNICENTRE.RLI_ID_ROLE_INDIVIDU = (SELECT RLI_ID_ROLE_INDIVIDU FROM DBO.TR_ROLE_INDIVIDU_RLI WHERE RLI_LIB = 'Distributeur')
    INNER JOIN dbo.T_INDIVIDU_IND IND with (nolock)
     ON CNICENTRE.IND_ID_INDIVIDU = IND.IND_ID_INDIVIDU
    INNER JOIN dbo.T_CENTRE_CNT CNT with (nolock)
     ON CNT.CNT_ID_CENTRE = IND.CNT_ID_CENTRE
    INNER JOIN dbo.TR_RESEAU_VENTE_RSV RSV with (nolock)
     ON INC.RSV_ID_RESEAU_VENTE = RSV.RSV_ID_RESEAU_VENTE
    INNER JOIN dbo.TJ_CONTRAT_INDIVIDUS_CNI AS CNIADH with (nolock)
     ON CNIADH.CON_ID_CONTRAT = CON.INC_ID_CONTRAT
     AND CNIADH.CNI_TOP_DERNIER_ACTEUR_ROLE = '1'
     AND CNIADH.RLI_ID_ROLE_INDIVIDU = (SELECT RLI_ID_ROLE_INDIVIDU FROM DBO.TR_ROLE_INDIVIDU_RLI WHERE RLI_LIB = 'Adhérent')
    LEFT OUTER JOIN dbo.T_COORDONNEES_BANCAIRES_CRB CRB with (nolock)
     ON CRB.IND_ID_INDIVIDU = CNIADH.IND_ID_INDIVIDU
     AND CRB.CRB_TOP_PRINCIPAL = '1'
     
    left JOIN dbo.TJ_CONTRAT_INDIVIDUS_CNI AS ConAPPAFF with (nolock)
     ON ConAPPAFF.CON_ID_CONTRAT = CON.INC_ID_CONTRAT
     AND ConAPPAFF.CNI_TOP_DERNIER_ACTEUR_ROLE = '1'
     AND ConAPPAFF.RLI_ID_ROLE_INDIVIDU = (SELECT RLI_ID_ROLE_INDIVIDU FROM DBO.TR_ROLE_INDIVIDU_RLI WHERE RLI_LIB = 'Apporteur d''affaire')
    left JOIN dbo.T_INDIVIDU_IND APPAFF with (nolock)
     ON ConAPPAFF.IND_ID_INDIVIDU = APPAFF.IND_ID_INDIVIDU
    left join T_CONTACT_CENTRE_CNC CNC
     ON CNC.CNC_ID_CONTACT_CENTRE=APPAFF.CNC_ID_CONTACT_CENTRE
     
    WHERE
     (CON.CON_DT_CREATION_SYS >= DATEADD(DAY, -90, GETDATE())
     OR CON.CON_DT_MODIFICATION_SYS >= DATEADD(DAY, -90, GETDATE())
     OR CNICENTRE.CNI_DT_CREATION_SYS >= DATEADD(DAY, -90, GETDATE())
     OR CRB_DT_CREATION_SYS >= DATEADD(DAY, -90, GETDATE())
     OR CRB.CRB_DT_MODIFICATION_SYS >= DATEADD(DAY, -90, GETDATE())
     )
    --CON.CON_ID_CONTRAT='7FDE079C-6DC1-449B-9626-75486D290B30'
    AND 
    CON.CON_TOP_DERNIERE_LIGNE = '1'
    voici les plans d'executions avant et apres la creation de l'index columstore
    Images attachées Images attachées   

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Ré essayez votre requête comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    DECLARE @IDG INT, @IDR INT, @IDI INT, @IDA INT, @D DATE ;
    SELECT @IDG = RGR_ID_REGROUPEMENT FROM TR_REGROUPEMENT_RGR WHERE RGR_ID_SOURCE='3';
    SELECT @IDR = RLI_ID_ROLE_INDIVIDU FROM DBO.TR_ROLE_INDIVIDU_RLI WHERE RLI_LIB = 'Distributeur';
    SELECT @IDI = RLI_ID_ROLE_INDIVIDU FROM DBO.TR_ROLE_INDIVIDU_RLI WHERE RLI_LIB = 'Adhérent';
    SELECT @IDA = RLI_ID_ROLE_INDIVIDU FROM DBO.TR_ROLE_INDIVIDU_RLI WHERE RLI_LIB = 'Apporteur d''affaire';
    SET @D =  DATEADD(DAY, -90, GETDATE();
     
     
    SELECT 
    			 INC.INC_ID_CONTRAT as CON_IdContratKey
    			 ,CON.CON_ID_CONTRAT as REN_IdRenouvKey
    			 ,INC.INC_ID_ADHESION as CON_IdContrat
    			 ,CNT.CNT_CD_CENTRE as CEN_CodeCentre
    			 ,CON.CON_NUMERO as CON_NumContrat
    			 ,PRD.PRD_CD_PRODUIT as PRD_CodeProduit
    			 ,INC.INC_DT_SOUSCRIPTION as CON_DateAdhesion
    			 ,INC.INC_DT_REALISATION as CON_DateRealisation
    			 ,CON.CON_DT_DEBUT as CON_DateDebutContrat
    			 ,CON.CON_DT_FIN as CON_DateFinDeContrat
    			 ,CON.CON_DUREE_CONTRAT as CON_DureeContrat
    			 ,CASE WHEN SUBSTRING(CMB.CMB_RESULTAT, 1, 2) = 'OK' 
    			 THEN 'OK'
    			 ELSE CASE WHEN CMB.CMB_ID_CONTRAT IS null 
    			 THEN 'NA'
    			 ELSE 'KO' 
    			 END 
    			 END as CON_StatutAppelBienvenue
    			 ,CON.CON_TOP_TACITE as CON_TopTacite
    			 ,CONVERT(CHAR(6), INC.INC_DT_SOUSCRIPTION, 112) as CON_EcheanceCourante
    			 ,CON.CON_NB_LIGNE - 1 as ECH_NbrRenouvCourante
    			 ,CASE WHEN CON.CON_NB_LIGNE = 1 
    			 THEN '-' ELSE 'M' END
    			 as CON_TypeEcheanceCourante
    			 ,ISNULL(CNR.CNR_CODE,'-') as TRE_TypeRenouvCourante
    			 ,CONVERT(CHAR(6), INC.INC_DT_REALISATION, 112) as CON_AnneeMoisDeRealisation
    			 --,CASE WHEN CRB.CRB_ID_COORDONNEES_BANCAIRES IS NOT NULL AND RGP3.RGP_LIB ='Eligible AP-LIV'
    			 /*,CASE WHEN INC0.INC_TOP_RIB in ('1','T') -- 23/09/2015 
    									AND RGP3.RGP_LIB ='Eligible AP-LIV'
    			 THEN '1' ELSE '0' END CON_TopDossierComplet*/
    			 -- 11/04/2016 -- TFS7743 - Revoir flag DC dans ODS (Tacite ou Tacite à venir)
    			 ,CASE WHEN CON0.CON_TOP_TACITE in ('1','2','3','5') AND RGP3.RGP_LIB ='Eligible AP-LIV' THEN '1' ELSE '0' END CON_TopDossierComplet
    			 ,CASE RSV.RSV_LIB WHEN 'Vente à distance' THEN '1' ELSE '0' END CON_TopVD
    			 ,INC.INC_NUM_REF_GED as CON_NumStock
    			 ,RSV_LIB CON_ReseauVente
    			 ,CON0.CON_NUM_REF_GED
    			 ,CON0.CON_OPTION_VINCI
    			 ,CNC_CD_USER+CNC_TYPE_CONTACT Code_APPAFF
    FROM dbo.T_CONTRAT_CON CON 
    INNER join T_CONTRAT_CON CON0 
     ON CON.INC_ID_CONTRAT=CON0.INC_ID_CONTRAT 
     
    INNER JOIN dbo.T_INFOS_CONTRAT_INC INC 
     ON CON.INC_ID_CONTRAT = INC.INC_ID_CONTRAT 
     
    INNER JOIN dbo.T_INFOS_CONTRAT_INC INC0 
    	ON CON0.INC_ID_CONTRAT = INC0.INC_ID_CONTRAT 
     
    INNER JOIN T_PRODUIT_PRD PRD 
     ON CON.PRD_ID_PRODUIT = PRD.PRD_ID_PRODUIT
    LEFT JOIN TJ_REGROUPEMENT_PRODUIT_RGP RGP3 
     ON PRD.PRD_ID_PRODUIT = RGP3.PRD_ID_PRODUIT
     AND RGP3.RGR_ID_REGROUPEMENT = @IDG
    LEFT JOIN dbo.TR_CANAL_RENOUVELLEMENT_CNR CNR 
     ON CON.CNR_ID_CANAL_RENOU = CNR.CNR_ID_CANAL_RENOU
    LEFT OUTER JOIN (
     SELECT distinct CMB.CMB_ID_CONTRAT, CMB.CMB_RESULTAT
     from adhexp.T_CAMPAGNE_BIENVENUE_CMB CMB 
     join (
     select CMB_ID_CONTRAT, MAX(CMB_DT_APPEL) as CMB_DT_APPEL
     from adhexp.T_CAMPAGNE_BIENVENUE_CMB 
     group by CMB_ID_CONTRAT
     ) MCM
     on CMB.CMB_ID_CONTRAT = MCM.CMB_ID_CONTRAT
     and CMB.CMB_DT_APPEL = MCM.CMB_DT_APPEL
     ) CMB
     ON INC.INC_ID_ADHESION = CMB.CMB_ID_CONTRAT
    INNER JOIN dbo.TJ_CONTRAT_INDIVIDUS_CNI AS CNICENTRE 
     ON CNICENTRE.CON_ID_CONTRAT = CON.INC_ID_CONTRAT
     
    INNER JOIN dbo.T_INDIVIDU_IND IND 
     ON CNICENTRE.IND_ID_INDIVIDU = IND.IND_ID_INDIVIDU
    INNER JOIN dbo.T_CENTRE_CNT CNT 
     ON CNT.CNT_ID_CENTRE = IND.CNT_ID_CENTRE
    INNER JOIN dbo.TR_RESEAU_VENTE_RSV RSV 
     ON INC.RSV_ID_RESEAU_VENTE = RSV.RSV_ID_RESEAU_VENTE
    INNER JOIN dbo.TJ_CONTRAT_INDIVIDUS_CNI AS CNIADH 
     ON CNIADH.CON_ID_CONTRAT = CON.INC_ID_CONTRAT
     
    LEFT OUTER JOIN dbo.T_COORDONNEES_BANCAIRES_CRB CRB 
     ON CRB.IND_ID_INDIVIDU = CNIADH.IND_ID_INDIVIDU
     AND CRB.CRB_TOP_PRINCIPAL = '1'
     
    left JOIN dbo.TJ_CONTRAT_INDIVIDUS_CNI AS ConAPPAFF 
     ON ConAPPAFF.CON_ID_CONTRAT = CON.INC_ID_CONTRAT
     AND ConAPPAFF.CNI_TOP_DERNIER_ACTEUR_ROLE = '1'
     AND ConAPPAFF.RLI_ID_ROLE_INDIVIDU = @IDA
    left JOIN dbo.T_INDIVIDU_IND APPAFF 
     ON ConAPPAFF.IND_ID_INDIVIDU = APPAFF.IND_ID_INDIVIDU
    left join T_CONTACT_CENTRE_CNC CNC
     ON CNC.CNC_ID_CONTACT_CENTRE=APPAFF.CNC_ID_CONTACT_CENTRE
     
    WHERE
     (CON.CON_DT_CREATION_SYS >= @D)
     OR CON.CON_DT_MODIFICATION_SYS >= @D)
     OR CNICENTRE.CNI_DT_CREATION_SYS >= @D)
     OR CRB_DT_CREATION_SYS >= @D)
     OR CRB.CRB_DT_MODIFICATION_SYS >= @D)
     )
    --CON.CON_ID_CONTRAT='7FDE079C-6DC1-449B-9626-75486D290B30'
    AND 
    CON.CON_TOP_DERNIERE_LIGNE = '1'
    AND  and CON0.CON_NB_LIGNE=1
     AND INC.INC_ID_ADHESION IS NOT NULL
     	AND INC0.INC_ID_ADHESION IS NOT NULL
    	 AND CNICENTRE.CNI_TOP_DERNIER_ACTEUR_ROLE = '1'
     AND CNICENTRE.RLI_ID_ROLE_INDIVIDU = @IDR
      AND CNIADH.CNI_TOP_DERNIER_ACTEUR_ROLE = '1'
     AND CNIADH.RLI_ID_ROLE_INDIVIDU = @IDI
    1) factorisation scalaire
    2) suppression des nolock (donne des résulats faux)
    3) simplification DISTINCT inutile
    4) déplacement des restrictions hors des jointures

    essayez aussi de remplacer ce CASE généraliés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE WHEN CON0.CON_TOP_TACITE in ('1','2','3','5') AND RGP3.RGP_LIB ='Eligible AP-LIV' THEN '1' ELSE '0' END
    pas un CASE valué...


    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    merci Fred de ton retour

    que veux tu dire par factorisation scalaire ??

    2) suppression des nolock (donne des résulats faux)=>entierement d'accord c'est de la bouse
    3) simplification DISTINCT inutile =>ok

    déplacement des restrictions hors des jointures => je ne le savais pas, merci. mais comment SQL interprete t il un SELECT dans une jointure et un SELECT dans une variable ?

    essayez aussi de remplacer ce CASE généraliés => tu veux dire par un CASE WHEN ?

    merci a toi

  10. #10
    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
    Hello,

    En plus des conseils prodigués par SQLPro, je suis à peu près sûr que tu es dans un cas où un index columnstore n'est pas vraiment adapté.

    Si je fais référence à la requête fournie l'index columnstore est liée à la table TR_REGROUPEMENT_RGR identifié uniquement ici mais je peux me tromper. Est-ce qu'il y a un autre endroit où cette table est utilisée?
    Si tu peux nous fournir en pièce jointe le plan ca serait plus facile

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    LEFT JOIN TJ_REGROUPEMENT_PRODUIT_RGP RGP3 with (nolock)
     ON PRD.PRD_ID_PRODUIT = RGP3.PRD_ID_PRODUIT
     AND RGP3.RGR_ID_REGROUPEMENT = (SELECT RGR_ID_REGROUPEMENT FROM TR_REGROUPEMENT_RGR WHERE RGR_ID_SOURCE='3')
    ...
    De manière générale les index columnstore ont une grande utilisé sur les requêtes où les agrégations dominent (type reporting avec des GROUP BY, SUM avec peu de colonnes retournées ...)
    Ici il me semble que ce n'est pas le cas et il y a fort à parier que l'ensemble de ton plan ne fonctionne pas en mode batch, ce qui est aussi un des gros avantages du columnstore.

    A+

  11. #11
    Membre habitué Avatar de olivtone
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2010
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Eure et Loir (Centre)

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

    Informations forums :
    Inscription : Octobre 2010
    Messages : 242
    Points : 153
    Points
    153
    Par défaut
    merci de ton retour

    Ici il me semble que ce n'est pas le cas et il y a fort à parier que l'ensemble de ton plan ne fonctionne pas en mode batch => c'est a dire ?

    en tout cas c'est plus clair pour moi merci

  12. #12
    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 olivtone Voir le message
    merci de ton retour

    Ici il me semble que ce n'est pas le cas et il y a fort à parier que l'ensemble de ton plan ne fonctionne pas en mode batch => c'est a dire ?
    Tu peux le voir sur chaque opérateur de ton plan ici

    Nom : batch_row_mode.jpg
Affichages : 138
Taille : 25,8 Ko

Discussions similaires

  1. [débutant] questions - regroupement indexes et jobs ?
    Par nagty dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 21/07/2005, 08h17
  2. Question sur les index
    Par barok dans le forum Décisions SGBD
    Réponses: 4
    Dernier message: 31/05/2005, 08h06
  3. [DB2] Question sur les index et les vues
    Par ahoyeau dans le forum DB2
    Réponses: 1
    Dernier message: 14/03/2005, 08h30
  4. Questions sur les indexations
    Par freud dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/05/2004, 11h38
  5. question sur les vertex buffer et index buffer
    Par airseb dans le forum DirectX
    Réponses: 9
    Dernier message: 25/08/2003, 02h38

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