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

Langage SQL Discussion :

Probleme de lenteur dans une requete


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Probleme de lenteur dans une requete
    J'ai un gros problème de lenteur sur une requête faite par un de nos fournisseurs ...
    le system : serveur DELL PowerEdge 1950 Bi-Xeon 3ghz 4Go de RAM - 5 disques 150Go en RAID SCSI 15.000rpm

    la requête si dessous fait monter les 4 processeurs du serveur jusqu’a 40%
    et extrait les 10 lignes en 4 minutes parmi une base de 30 millions
    Pour indication en mettant de coté la fonction « replicate » ca tourne à fond la caisse !

    Est ce que la fonction replicate peut etre optimiser ou rempalcer par une autre fonction ?

    Merci
    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
     
    SET QUOTED_IDENTIFIER ON 
    GO
    SET ANSI_NULLS OFF 
    GO
     
     
    ALTER  PROCEDURE INS_RECDOSSIER
     (
    @ADVNUMBER	VARCHAR(10)
    )
    AS
     
    BEGIN
     
    Insert into Dossiers.dbo.RECDOSSIER 
    select 
    	replicate('0', 10- (len(RIG.ItemSetName))) + RIG.ItemSetName as ADVNUMBER, 
     
    	 RIG.ItemSetName as ADVNUMBER, 
    	case RIG.LEVEL3 when '' then RIG.LEVEL2 else RIG.LEVEL3 END as TYPOLOGIE,
    	case DosOrEtat.IdStatutORA when 'AD' then '' else DosOrEtat.IdStatutORA END as Etat,
    	RIG.addDtime as DateIndexation
    	ISNULL(ReqItemGlobal.LEVEL3,ReqItemGlobal.LEVEL2) as Typo,
    FROM
    	base1.dbo.REITEMGLOBAL RIG,Dossiers.dbo.EtatDossier DosOrEtat
    WHERE	
    	  RIG.ItemSetName = @ADVNUMBER
     
                replicate('0', 10- (len(RIG.ItemSetName))) + RIG.ItemSetName = replicate('0', 10- (len(@ADVNUMBER))) + @ADVNUMBER
    	ReqItemGlobal.ItemSetName ='0008685848'
    AND
    	RIG.ItemStatusId = DosOrEtat.IdStatutRec
    AND 
    	RIG.Level1 + RIG.Level2 + RIG.LEvel3  NOT IN (SELECT E.LEVEL1 + E.LEVEL2 + E.LEVEL3
    			FROM EXCLUSION E)
    UNION
    select 
    	replicate('0', 10- (len(@ADVNUMBER))) + @ADVNUMBER as ADVNUMBER,
     
                  @ADVNUMBER as ADVNUMBER,
    	null as TYPOLOGIE,
    	'AD' as ETAT,
    	null as DateIndexation
    FROM
    	base1.dbo.REITEMGLOBAL RIG
     
    WHERE 
    	NOT EXISTS (SELECT ItemGlobal.ItemSetName 
    				 FROM base1.dbo.REITEMGLOBAL ItemGlobal 
    				WHERE replicate('0', 10- (len(ItemGlobal.ItemSetName))) + ItemGlobal.ItemSetName = replicate('0', 10- (len(@ADVNUMBER))) + @ADVNUMBER ) 
     
    	NOT EXISTS (SELECT ItemGlobal.ItemSetName 
    				 FROM base1.dbo.REITEMGLOBAL ItemGlobal 
    				WHERE  ItemGlobal.ItemSetName =  @ADVNUMBER ) 
     
    AND
    	RIG.Level1 + RIG.Level2 + RIG.LEvel3 NOT IN (SELECT E.LEVEL1 + E.LEVEL2 + E.LEVEL3
    			FROM EXCLUSION E)
     
    END;
    GO
    SET QUOTED_IDENTIFIER OFF 
    GO
    SET ANSI_NULLS ON 
    GO

  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 879
    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 879
    Points : 53 057
    Points
    53 057
    Billets dans le blog
    6
    Par défaut
    C'est parfaitement normal et vous ne pourrez jamais optimiser une telle requête. En effet l'utilisation d'une fonction (quelle qu'elle soit, même implicite) empêche toute utilisation d'index.
    Or vous utilisez à différents niveaux votre replicate...
    Et si j'ai bien compris uniquement pour des raisons cosmétiques !

    Lisez l'article que j'ai écrit sur les erreurs fondamentales à ne JAMAIS commettre : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9

    Lorsque vous ajoutez des zéros en tête... enrichissez vous la donnée en terme sémantique ? Ou n'est ce pas simplement un problème de présentation ???
    Vous venez de comprendre votre erreur !

    Bref, si vous voulez que votre requête marche, commencez par retirer toute cosmétique aux données, y compris dans celles déjà stockées.
    Pour embellir vos données vous pouvez utiliser au choix :
    • un traitement sur un server de présentation (serveur web par exemple)
    • un traitement sur le client lourd
    • un traitement sur le client léger
    • un traitement sur un serveur d'objet

    et la plus mauvaise solution (mais la plus
    pratique)
    • faire une vue qui encapsule la cosmétique..


    Lisez aussi ce que j'ai écrit sur l'optimisation en général :
    http://sqlpro.developpez.com/cours/optimiser/
    et sur SQL Server en particulier :
    http://sqlpro.developpez.com/optimisation/

    A +

Discussions similaires

  1. [Access] Probleme de count dans une requete sql
    Par castelligreg dans le forum Langage SQL
    Réponses: 6
    Dernier message: 14/04/2006, 16h20
  2. [sql]Probleme de count dans une requete sql (sous access)
    Par castelligreg dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 14/04/2006, 16h06
  3. [MySQL] probleme de syntaxe dans une requete sql
    Par jeanfrancois dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 28/03/2006, 10h54
  4. [JDBC]problème de syntaxe dans une requête en java...
    Par chti_juanito dans le forum JDBC
    Réponses: 60
    Dernier message: 04/11/2005, 16h47
  5. Probleme de logique dans une requete
    Par linou dans le forum Langage SQL
    Réponses: 11
    Dernier message: 18/03/2005, 19h52

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