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 :

Requête SELECT avec une grosse volumétrie en suspended


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut Requête SELECT avec une grosse volumétrie en suspended
    Bonjour à tous,

    J'ai une requête en select avec une jointure entre deux tables de grosse volumétrie (100M sur la table principale et 15 dans la table secondaire) et j'ai un status suspended.
    Le but est de select une seule colonne d'ID pour récupérer ces ID et les récupérer pour pouvoir les delete.
    la clé de jointure repose sur huit colonnes, indexées dans les deux tables.

    la première table est une table définitive et la deuxième une table temporaire, je joins les deux le la clé métier pour trouver les ID des lignes présentes dans ma table définitive à virer avant que les lignes de la temporaire les remplacent.

    Et donc mon problème c'est que ça n'avance pas et quand je regarde le status de la requête elle est suspended et je ne sais pas comment faire pour récupérer ma liste d'ID.
    la requête fonctionne bien, mais sur des plus petites volumétries.

    Avez-vous une idée de comment débloquer la situation ?

    Merci d'avance pour votre coup de main

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 780
    Points
    30 780
    Par défaut
    Je n'ai pas bien compris : c'est une requête SELECT ou une requête DELETE ?
    Peut-être qu'en voyant la requête ce sera plus simple pour t'aider...
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Effectivement, je vais être plus précis.

    En fait via SSIS, je charge un fichier brut et en source de ce chargement ma requête select qui bloque :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    select ID_TABLE_DEFINITIVE
    from TABLE_DEFINITIVE as DEF
    JOIN TABLE_TEMP as TEMP
    	ON DEF.COLONNE_1 = TEMP.COLONNE_1
    	AND DEF.COLONNE_2 = TEMP.COLONNE_2
    	AND DEF.COLONNE_3 = TEMP.COLONNE_3
    	AND DEF.COLONNE_4 = TEMP.COLONNE_4
    	AND DEF.COLONNE_5 = TEMP.COLONNE_5
    	AND DEF.COLONNE_6 = TEMP.COLONNE_6
    	AND DEF.COLONNE_7 = TEMP.COLONNE_7
    	AND DEF.COLONNE_8 = TEMP.COLONNE_8
    	AND DEF.DATE_1 = TEMP.DATE_1
    Donc je fais ce select dans ma source OLEDB et celle ci va charger mon fichier brut. Une fois le fichier brut chargé, je fais un DELETE en fonction des ID présent dans le fichier brut.

    Mais j'ai testé directement la requête select dans SSMS et à ce point de volumétrie, ça bloque...

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 538
    Points
    52 538
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Slaveak Voir le message
    ...la clé de jointure repose sur huit colonnes, indexées dans les deux tables....
    Votre problème vient très certainement de là !!!!

    Il est déjà moyennement performant d'avoir une clef comportant 2 colonnes. Alors avec 8 'est parfaitement imbécile ! Je suppose en sus que ce sont des colonnes fonctionnelles genre VARCHAR... (ce qui serait le pire du pire...)
    Commencez par réduire la clef et vous verrez que tout ira mieux !

    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/ * * * * *

  5. #5
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Et bien je veux bien la réduire, mais je la réduit comment ? C'est une clé fonctionnelle donc je n'ai pas le choix, il faut que j'ai ces 8 colonnes, ou tout du moins leur contenu... je créé une colonne concaténée avec les 8 valeurs (qui ne sont que des numerics ou des int) ?

    En tout cas merci pour la piste.

    Autre question n'aurais je pas intérêt à partitionner ma grosse table de fait ? (vous allez me dire que oui mais bon...) mais selon quel critère ? par rapport à une date qui va être utilisé dans l'outils de restitution ? ou plus se mes critères techniques d'intégrateur ?

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Slaveak Voir le message
    Et bien je veux bien la réduire, mais je la réduit comment ? C'est une clé fonctionnelle donc je n'ai pas le choix, il faut que j'ai ces 8 colonnes, ou tout du moins leur contenu... je créé une colonne concaténée avec les 8 valeurs (qui ne sont que des numerics ou des int) ?
    Surtout pas !
    Il faut une colonne unique de type integer et dont le contenu est un identifiant technique. Le plus simple est d'utiliser une valeur attribuée par la base de donnée.
    Ca vous garantira une clef stable et concise, donc performante.

    Citation Envoyé par Slaveak Voir le message
    Autre question n'aurais je pas intérêt à partitionner ma grosse table de fait ? (vous allez me dire que oui mais bon...) mais selon quel critère ? par rapport à une date qui va être utilisé dans l'outils de restitution ? ou plus se mes critères techniques d'intégrateur ?
    Partitionner oui, le(s) critère(s) dépend(ent) de l'exploitation et des contraintes de service

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 538
    Points
    52 538
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Slaveak Voir le message
    Et bien je veux bien la réduire, mais je la réduit comment ? C'est une clé fonctionnelle donc je n'ai pas le choix, il faut que j'ai ces 8 colonnes, ou tout du moins leur contenu... je créé une colonne concaténée avec les 8 valeurs (qui ne sont que des numerics ou des int) ?

    En tout cas merci pour la piste.

    Autre question n'aurais je pas intérêt à partitionner ma grosse table de fait ? (vous allez me dire que oui mais bon...) mais selon quel critère ? par rapport à une date qui va être utilisé dans l'outils de restitution ? ou plus se mes critères techniques d'intégrateur ?
    Une solution consiste à rajouter une colonne calculée sous la forme d'un hachage des colonnes clef. Ceci suppose que vous intégrez le fichier en temps que table temporaire puis rajouter cette colonne calculée persistance, la modifiez en NOT NULL et en faites un index unique CLUSTERED.

    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/ * * * * *

  8. #8
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Une solution consiste à rajouter une colonne calculée sous la forme d'un hachage des colonnes clef. Ceci suppose que vous intégrez le fichier en temps que table temporaire puis rajouter cette colonne calculée persistance, la modifiez en NOT NULL et en faites un index unique CLUSTERED.
    C'est une superbe idée ! Merci beaucoup !

    Je ne sais pas trop comment faire techniquement pour faire ce hachage de colonnes clés mais je vais chercher tout ça. (oui car à la base, je ne suis qu'un humble intégrateur de données quasi autodidacte).

    Je vous tiens au courant des résultats de mes développements.

  9. #9
    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 : 42
    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,

    Utilisez pour cela la fonction HASHBYTES avec un algorithme costaud (SHA2_256 ou SHA2_512) de façon à éviter les collisions.
    Ne persistez pas la colonne (vous ne l'afficherez à priori jamais), mais indexez-la pour supporter la jointure.

    Cela dit il serait intéressant de voir quel est le type d'attente qui place la requête à SUSPENDED.
    Que donnent les colonnes wait_type et wait_time de la vue sys.dm_exec_requests pour la session considérée ? Je parie sur CXPACKET.

    @++

  10. #10
    Membre régulier
    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Août 2014
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2014
    Messages : 103
    Points : 118
    Points
    118
    Par défaut
    @ SQLpro et elsuket : J'étais justement en train ( et pour la énième fois) de reparcourir votre bouquin sur le sujet et justement il est bien écrit qu'il peut y avoir des colisions si j'utilise un CHECKSUM et j'aillais justement vous demander si c'était pas un peu risqué de tenter via un CHECKSUM donc merci pour ta précision.

    Mais je peux faire un HASHBYTES sur plusieurs colonnes ? Vous écrivez dans votre ouvrage, que le HASHBYTES renvoie une clé en fonction d'une valeur scalaire, mais justement, cette valeur serait donc le résultat de mes 8 colonnes non ?

    Sinon oui je vais vérifier le wait_type et je vous fais un retour.

    Encore une fois merci pour les coups de mains.

    EDIT : @elsuket tu es trop fort ! le wait_type est bien un CXPACKET !

Discussions similaires

  1. Optimisation d'une requête SELECT sur une grosse table
    Par eracius dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/05/2008, 14h51
  2. Réponses: 6
    Dernier message: 30/01/2008, 22h20
  3. [SQL] Requête SELECT avec un paramètre pour choisir une colonne
    Par svergeylen dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 26/12/2007, 17h36
  4. Requête SELECT avec deux champs dans une colonne ??
    Par fredhali2000 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 08/06/2006, 10h41
  5. Requête selection avec une variable de date
    Par kahmsin dans le forum Access
    Réponses: 7
    Dernier message: 20/11/2005, 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