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 :

Optimisation Union All SQL SERVER 2k5


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    Par défaut Optimisation Union All SQL SERVER 2k5
    Bonjour,

    Débutant sur SQL SERVER , je souhaiterais optimiser ces requêtes jointes par la syntaxe UNION ALL.

    Pouvez-vous m'aider ?

    Ci-dessous les requêtes concernées
    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
     
     
    SELECT
    		distinct 'XXX' as FlowType ,
    		rh.delivery_memo, 
    		NULL as sender, 
    		rh.store_code_id as dest, 
    		rh.creation_date as dt, 
    		rdl.product_id,
    		rdl.color_id,
    		rdl.size_id,
    		abs(rdl.loose_qty_rm) as qty, 
    		NULL as reason_id,
    		rdl.landed_price as avg_cost, 
    		rdl.price_retail as retail_price
     
    		from rm_header rh (nolock) 
    			inner join rm_detail_loose rdl (nolock) on rh.rm_number = rdl.rm_number and rh.store_code_id = rdl.store_code_id 
    			--and rh.store_code_id = 88
    			where 
    			(
    			   (convert(int,convert(char(8), rh.creation_date, 112)) <= convert(int,convert(char(8), @date, 112)) 
    				and rh.rm_status = 'R' and rh.reception_status = 'N' 
    				)
    				or 
    				(convert(int,convert(char(8), rh.creation_date, 112)) <= convert(int,convert(char(8), @date, 112)) 
    				and
    				convert(int,convert(char(8), rh.modified_date, 112)) > convert(int,convert(char(8),@date,112)) and
    					rh.rm_status = 'R' and rh.reception_status = 'C'
    				)
    			)
    		and ( rh.delivery_memo is null or ( rh.delivery_memo is not null and rh.delivery_memo not like 'ZZZ%'))
     
     
    		union all
     
     
    SELECT  
                             distinct 'YYY' as FlowType, 
    		NULL as delivery_memo, 
    		th.transfer_from_store_id as sender, 
    		th.transfer_to_store_id as dest, 
    		th.transfer_date as dt, 
    		bd.product_id,
    		bd.color_id,
    		bd.size_id, 
    		case when th.transfer_status = 3 then abs(bd.bin_qty_stocks) 
    		when th.transfer_status = 5 then abs(troutd.quantity) end as qty, th.reason_id as reason_id
    		, TROD_PriceCost as avg_cost, Cession_Price as retail_price
    		from bin_header bh (nolock) 
    			inner join bin_detail bd (nolock) on  bh.bin_id = bd.bin_id and bh.store_code_id = bd.store_code_id and bd.store_code_id in (select store_code_id from store (nolock) where store_type = 'V')
    			inner join transfer_header th (nolock) on bh.bin_id = th.transfer_number
    			inner join trout_header trout (nolock) on trout.transfer_number = th.transfer_number 
    			inner join trout_detail troutd (nolock) on trout.transdate= troutd.transdate and trout.store_code_id = troutd.store_code_id 
    			and trout.till_id=troutd.till_id and trout.transnum=troutd.transnum and trout.transtime=troutd.transtime
    			and troutd.product_id = bd.product_id and troutd.color_id = bd.color_id and troutd.size_id = bd.size_id
    		where ((th.transfer_status = 3 and convert(int,convert(char(8), th.transfer_date, 112)) <= convert(int,@date)) 
    			or 
    			(th.transfer_status = 5 and convert(int,convert(char(8), th.transfer_date, 112)) <= convert(int,@date)
    			and not exists (select 'f' from trin_header inh where th.transfer_number = inh.transnum and
    					th.transfer_to_store_id = inh.store_code_id and 
    					convert(char(8), inh.transdate, 112) <= CONVERT(char(8),@date,112))
    			))
    		and trout.approved = 'Y'
     
    		union all
     
    SELECT
                            distinct 'ZZZ' as FlowType, 
                             rmh.delivery_memo,
    		rh.store_code_id as sender, 
                             sdest.store_code_id as dest, 
                              rmh.creation_date as dt, 
    		rd.product_id,
    		rd.color_id,
    		rd.size_id,
    		abs(rd.loose_qty_rtv) as qty, r.reason_id, 
    		rdl.landed_price as avg_cost, rdl.price_retail as retail_price
    		from  
    			rtv_header rh (nolock) 
    			inner join store s1 (nolock) on rh.store_code_id = s1.store_code_id
    			inner join rtv_detail_loose rd (nolock) on rh.rtv_number = rd.rtv_number
    			inner join reasons r (nolock) on r.reason_id = rh.reason_id
    			inner join store sdest (nolock) on convert(nvarchar(8),sdest.store_code_id) = r.mq_queue_sender
    			inner join rm_header rmh (nolock) on rtrim(rmh.delivery_memo) like 'VIS%'+ rtrim(convert(varchar,rh.rtv_number)) 
    			inner join rm_detail_loose rdl (nolock) on rmh.rm_number = rdl.rm_number and rmh.store_code_id = rdl.store_code_id 
    			and rd.product_id = rdl.product_id and rd.color_id = rdl.color_id and rd.size_id = rdl.size_id
    		where 
    			(
    			   (convert(int,convert(char(8), rmh.creation_date, 112)) <= convert(int,convert(char(8), @date, 112)) 
    				and rmh.rm_status = 'R' and rmh.reception_status = 'N' 
    				)
    				or 
    				(convert(int,convert(char(8), rmh.creation_date, 112)) <= convert(int,convert(char(8), @date, 112)) 
    				and
    				convert(int,convert(char(8), rmh.modified_date, 112)) > convert(int,convert(char(8),@date,112)) and
    					rmh.rm_status = 'R' and rmh.reception_status = 'C'
    				)
    			)
    		and rh.approved = 'Y' and  convert(int,convert(char(8), rh.creation_date, 112)) <= convert(int,convert(char(8), @date, 112))
    		and r.description like 'ZZZ%'
    Errare Humanum Est ...

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    WHERE 
    			(
    			   (convert(int,convert(char(8), rh.creation_date, 112)) <= convert(int,convert(char(8), @date, 112)) 
    ...

    Quel est le type de vos colonne dates ?
    (et de votre paramètre date)

    il ne serait pas inutile de fournir la structure des tables et des index

  3. #3
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    Par défaut
    Bonjour ,

    Le type de la variable @date

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    declare @date char(8)
    select @date = convert(char(8), dateadd(d, -1, getdate()),112)
    Errare Humanum Est ...

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    et le type de vos colonnes ???

    pourquoi ne pas utiliser le type DATE ?

    quelle est votre version de SQL Server ?

    Combien de temps met la requête a s’exécuter ?

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    Par défaut
    Type de mes colonnes date : "datetime"

    Version de SQL SERVER 2k5 :
    9.00.3042.00 SP2 Enterprise Edition (64-bit)

    La requête met 1min30s
    Errare Humanum Est ...

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Commencez par remplacer la déclaration/initialisation de @date par ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    DECLARE @date AS DATETIME
    SET @date =  DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()) + 1 , 0)

    puis remplacez tous vos :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    convert(int,convert(char(8), rh.creation_date, 112)) <= convert(int,convert(char(8), @date, 112))

    Par
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rh.creation < @date


    Indiquez nous aussi quels sont les index sur ces tables.

    Aussi, pouvez-vous expliquer le but/contexte de ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    			INNER JOIN store sdest (nolock) ON convert(nvarchar(8),sdest.store_code_id) = r.mq_queue_sender
    			INNER JOIN rm_header rmh (nolock) ON rtrim(rmh.delivery_memo) LIKE 'VIS%'+ rtrim(convert(varchar,rh.rtv_number))

  7. #7
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Les rtrim sont également clairement à bannir!
    AND ( rh.delivery_memo IS NULL OR ( rh.delivery_memo IS NOT NULL AND rh.delivery_memo NOT LIKE 'ZZZ%'))
    Voir du côté du NOT LIKE 'ZZZ%' qui pourrait peut être avantageusement être remplacé par un 'etat' dans votre table de type bit... ('estZZZ' oui/non).
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  8. #8
    Membre régulier
    Homme Profil pro
    Inscrit en
    Décembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 101
    Points : 88
    Points
    88
    Par défaut
    Merci pour vos conseils!!

    Cela à améliorer le temps de réponse.

    Merci !
    Errare Humanum Est ...

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/05/2008, 15h16
  2. [C# 2K8 & MS-SQL Server 2K5] Probléme de sauvegarde DB avec SMO
    Par emmr.rida dans le forum Développement
    Réponses: 2
    Dernier message: 03/05/2008, 14h30
  3. [Oracle 10g & MS SQL Server 2K5] DTS Import/Export Wizard
    Par tamiii dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 11/04/2008, 09h08
  4. Optimisation Update sur SQL SERVER 2000
    Par Hansen69 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/12/2007, 22h17
  5. Réponses: 3
    Dernier message: 06/07/2006, 09h47

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