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

Développement SQL Server Discussion :

Index sur données XML [2008]


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Points : 39
    Points
    39
    Par défaut Index sur données XML
    Bonjour,

    je croyais déja avoir posté cette question mais je ne retrouve pas le topic donc dans le doute je recommence.
    Nous alimentons des tables à partir de fichiers xml.
    Avec ce fichier, j'alimente une colonne de type xml de ma table (T_Fiche_Icecat).

    Pour alimenter ma table ICE_Product à partir du contenu xml, j'utilise la requête suivante:

    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
     
    insert into ICE_Product
    select distinct
    		 C.value('./@ID','int')as ProductID	 
    		,C.value('./@Code','integer')  as Code	
    		,C.value('./@HighPic','varchar(1000)') as HighPic  
    		,C.value('./@HighPicHeight','int')  as HighPicHeight	
    		,C.value('./@HighPicSize','int') as HighPicSize	
    		,C.value('./@HighPicWidth','int')as HighPicWidth	
    		,C.value('./@LowPic','varchar(1000)') as	LowPic
    		,C.value('./@LowPicHeight','int') as LowPicHeight	
    		,C.value('./@LowPicSize','int') as LowPicSize	
    		,C.value('./@LowPicWidth','int') as	LowPicWidth
    		,C.value('./@Name','varchar(1000)') as Name	
    		,C.value('./@Pic500x500','[varchar](1000)') as	Pic500x500
    		,C.value('./@Pic500x500Height','int') as Pic500x500Height
    		,C.value('./@Pic500x500Size','int') as	Pic500x500Size
    		,C.value('./@Pic500x500Width','int') as	 Pic500x500Width 
    		,C.value('./@Prod_id','varchar(255)') as Prod_id	
    		,C.value('./@Quality','varchar(255)') as Quality  
    		,C.value('./@ReleaseDate','datetime') as ReleaseDate	
    		,C.value('./@ThumbPic','varchar(1000)') as ThumbPic	
    		,C.value('./@ThumbPicSize','int') as ThumbPicSize	 
    		,C.value('./@Title','varchar(2000)') as Title
    		,null
    		,GETDATE()
    from T_Fiche_Icecat T 
    CROSS APPLY T.ContenuXML.nodes('ICECAT-interface/Product') AS T_XML(C)	
    	left join ICE_Product P on P.ProductId=C.value('./@ID','int')
    where ContenuXML.exist('ICECAT-interface/Product')=1
    	and P.ProductId is null


    J'ai posé un index primaire et secondaire de type path sur ma colonne xml.

    Mes résultat ne sont pas toujours rapide, meme si je n'ai aucune ligne à ajouter dans ICE_Product.

    Pour la jointure avec ma table ICE_Product, est ce que ajouté un index de type value pourrait accelerer mes resultats?
    Si oui, dois je respecter une syntaxe particuliere?

    Dans la doc msdn, la sybntaxe suivante est indiqué:
    //author[LastName="someName"], où vous connaissez la valeur de l'élément <LastName>, mais où le parent <author> peut se placer n'importe où.
    /book[@* = "someValue"], où la requête recherche l'élément <book> dont un attribut possède la valeur "someValue".
    mais je ne sais pas comment l'appliquer à une jointure.

    Merci d'avance pour vos retours.

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    Peut être que je ne donne pas assez de renseignement.

    Le but est de télécharger un catalogue de produit (et les caractéristiques).
    Quand on nous demande de gérer un produit, on télécharge la fiche xml du produit sur le site IceCat (http://www.icecat.fr/). Et on implémente les données dans nos tables.

    Voici un exemple d'un fiche XML issu de IceCat : http://openIcecat-xml:freeaccess@dat...FR/4018674.xml
    Je voulais mettre le fichier en PJ mais je me fais jeter pour fichier invalide.

    Pour reformuler ma question, y a t'il moyen d’accélérer ma requête grâce à l'utilisation des indexes xml?

    Si vous avez besoin d'autres informations je vous les donnerais.

    Merci d'avance.

  3. #3
    Rédacteur
    Avatar de pcaboche
    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    2 785
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Singapour

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 785
    Points : 9 716
    Points
    9 716
    Par défaut
    Je remarque quelque chose dans votre requête :

    D'un côté, vous extrayez l'information à partir du XML :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    C.value('./@ID','int') as ProductID
    ...et juste ensuite, vous allez à nouveau chercher cette information pour faire votre jointure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    left join ICE_Product P on P.ProductId=C.value('./@ID','int')
    SQL Server ne peut pas utiliser d'index dans ce cas, donc c'est lent !

    Il faut que votre jointure ressemble à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    left join ICE_Product P on P.ProductId = SomeAlias.Id
    Ce qu'il faut faire :
    1. extraire l'information à partir du XML (comme vous l'avez fait)
    2. utiliser cette information pour insérer les données manquantes dans votre table ICE_Product

    Pour la partie 2, vous pouvez éventuellement considérer utiliser l'instruction MERGE. Vous gagnerez sans doute en visibilité :

    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
    MERGE ICE_Product T 
    USING
    (
        SELECT DISTINCT
              C.value('./@ID','int')as ProductID     
            ,C.value('./@Code','integer')  as Code    
            ,C.value('./@HighPic','varchar(1000)') as HighPic  
            ,C.value('./@HighPicHeight','int')  as HighPicHeight    
            ,C.value('./@HighPicSize','int') as HighPicSize    
            ,C.value('./@HighPicWidth','int')as HighPicWidth    
            ,C.value('./@LowPic','varchar(1000)') as    LowPic
            ,C.value('./@LowPicHeight','int') as LowPicHeight    
            ,C.value('./@LowPicSize','int') as LowPicSize    
            ,C.value('./@LowPicWidth','int') as    LowPicWidth
            ,C.value('./@Name','varchar(1000)') as Name    
            ,C.value('./@Pic500x500','[varchar](1000)') as    Pic500x500
            ,C.value('./@Pic500x500Height','int') as Pic500x500Height
            ,C.value('./@Pic500x500Size','int') as    Pic500x500Size
            ,C.value('./@Pic500x500Width','int') as     Pic500x500Width 
            ,C.value('./@Prod_id','varchar(255)') as Prod_id    
            ,C.value('./@Quality','varchar(255)') as Quality  
            ,C.value('./@ReleaseDate','datetime') as ReleaseDate    
            ,C.value('./@ThumbPic','varchar(1000)') as ThumbPic    
            ,C.value('./@ThumbPicSize','int') as ThumbPicSize     
            ,C.value('./@Title','varchar(2000)') as Title
            ,null
            ,GETDATE()
        FROM T_Fiche_Icecat T 
        CROSS APPLY T.ContenuXML.nodes('ICECAT-interface/Product') AS T_XML(C)
        WHERE ContenuXML.exist('ICECAT-interface/Product')=1
    ) S
        ON T.ProductId = S.Id
    WHEN NOT MATCHED THEN
        INSERT (  ProductID,   Code,   HighPic,   HighPicHeight,   HighPicSize,   HighPicWidth,   LowPic,   LowPicWidth,   Name,   Pic500x500,   Pic500x500Height,   Pic500x500Size,   Pic500x500Width,   Prod_id,   Quality,   ReleaseDate,   ThumbPic,   ThumbPicSize,   Title)
        VALUES (S.ProductID, S.Code, S.HighPic, S.HighPicHeight, S.HighPicSize, S.HighPicWidth, S.LowPic, S.LowPicWidth, S.Name, S.Pic500x500, S.Pic500x500Height, S.Pic500x500Size, S.Pic500x500Width, S.Prod_id, S.Quality, S.ReleaseDate, S.ThumbPic, S.ThumbPicSize, S.Title)
    END;
    "On en a vu poser les armes avant de se tirer une balle dans le pied..."
    -- pydévelop

    Derniers articles:

    (SQL Server) Introduction à la gestion des droits
    (UML) Souplesse et modularité grâce aux Design Patterns
    (UML) Le Pattern Etat
    Autres articles...

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    J’espérais pouvoir éviter d'extraire les données xml que j'ai déjà implémentées en table.
    Mais à priori ce n'est pas possible.
    Je vais donc garder la syntaxe que vous proposer qui est plus claire.

    Merci pour cette réponse.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 22
    Dernier message: 02/02/2009, 20h36
  2. Envoi données xml sur http à une servlet
    Par thierry_b dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 09/01/2009, 12h38
  3. Vue indexée sur deux bases de donnée
    Par mochi dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/12/2008, 12h20
  4. [Blog] Fonctionnant sur base de données XML
    Par koKoTis dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 13/10/2008, 17h53
  5. Problème avec les indexes sur une base de données.
    Par osoudee dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/02/2006, 09h24

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