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

MS SQL Server Discussion :

Optimisation Update sur SQL SERVER 2000


Sujet :

MS SQL Server

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

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Optimisation Update sur SQL SERVER 2000
    Bonjour,

    Je travaille actuellement sur SQL SERVER 2000 et j'ai un petit souci concernant une automatisation d'Update.

    Voilà le topo :

    J'ai une table T1 dans laquelle j'ai un champ C, et une autre table T2 dans laquelle j'ai un champ A et B.

    T1 contient 700 000 lignes , T2 100 lignes.

    Le but est de remplir TOUS les champs C de T1 dans l'ordre qu'ils se presentent avec les champs A de la table T2.

    Le champ B de T2 indique le nombre d'éléments A qu'il faut placer dans les champs C de T1.

    Donc dans T2 on a un truc du style
    A B
    01 2000
    02 4000
    03 1500

    ce qui signifie qu'il faut placer dans le champ C de T1 l'élément 01 sur les 2000premières lignes, puis l'element 02 sur les 4000 lignes suivantes etc...

    Mon problème est que je n'ai pas trouve de solutions satisfaisantes pour executer ce traitement, comme le traitement est finalement tres iteratif j'ai utilise des cursors avec update dans une procedure stockée mais cela prend vraiment trop de temps a l'execution. Idem dans une procedure VB.

    Et je n'ai pas reussi a encapsuler le traitement dans des requetes SQL, car le SQL se prete peu à ce genre de traitement iteratif, là il s'agit de "poser" des données ligne à ligne jusqu'à la fin.

    En plus sur sql server 2000 il n'y a pas de fonction qui renvoie le numero de ligne d'une table, c'est bien dommage car là j'aurais pu updater les 2000 premieres lignes d'un coup puis les 4000 suivantes etc... etc...

    Bref... je me demande s'il y a moyen de faire ce genre de traitement sans qu'il prenne 2 heures à l'execution.

    Merci par avance.

  2. #2
    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,

    Tu devrais poster ton code, il sert de base et peut permettre de comprendre d'où vient la longueur d'exécution

    Je pense que ça doit ressembler à quelque chose comme:
    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
    DECLARE @VAL VARCHAR(2);
    DECLARE @NB VARCHAR(5);
     
    DECLARE CUR CURSOR FOR 
    	SELECT A, B FROM T2
     
    OPEN CUR
    FETCH NEXT FROM CUR INTO @VAL, @NB
     
    WHILE @@FETCH_STATUS = 0
    BEGIN
    	DECLARE @I INT; SET @I = 1;
    	WHILE @I <= @NB
    	BEGIN
    		INSERT T1 VALUES (@VAL);
    	END
    	FETCH NEXT FROM CUR INTO @VAL, @NB
    END
    Mais je ne comprends pas l'intérêt de faire autant d'insertions dans une table. Quel en est le but ?

    A+

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Voici un des codes que j'ai utilisé :
    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
     
    CREATE PROCEDURE ConnMarche.PT_DispatchDep AS
     
    DECLARE @Nb as integer
    DECLARE @Dep as varchar(3)
    DECLARE @Immat as integer
    DECLARE @compteur as integer
     
    DECLARE CurseurImmat CURSOR
    FOR 
       SELECT Cle_Dept
       FROM ImmatDep
     
    DECLARE CurseurDept CURSOR
    FOR 
       SELECT Departement,Nb
       FROM Departement
     
    BEGIN
     
    Open CurseurImmat
    Open CurseurDept
     
    FETCH CurseurImmat
    FETCH CurseurDept into @Dep,@Nb
     
     WHILE @@Fetch_Status = 0
     BEGIN
    	set @compteur = @Nb
    	While @compteur > 0
    	BEGIN
     
    		UPDATE ImmatDep
    		SET Cle_Dept = @Dep
    		WHERE CURRENT OF CurseurImmat
     
    		set @compteur = @compteur - 1
     
    		FETCH CurseurImmat
    	END
     
    	FETCH CurseurDept into @Dep,@Nb
    END
     
    END
    GO
    La table ImmatDep est ma table T1 et la table Departement est la table T2

    ImmatDep contient DEJA 700 000 lignes d'immatriculations, et la table Departement contient les departements et le nombre d'immat ex : 01 - 2000, 02 - 1500 ETC...

    Le but est de remplir le champ departement (qui est NULL a la base) de toutes les lignes de la table ImmatDep avec les departements de la table Departement en respectant le nombre d'immat et le tout de façon ALEATOIRE.

    Ma tactique jusqua present :
    1) Creer une nouvelle table qui est le resultat d'un melange de mes 700 000 lignes de ma table ImmatDep grace a une requete de tri aleatoire.
    2) Deposer mes departements ligne à ligne dans cette nouvelle table en respectant le nombre d'immat de chaque departement (c'est le but de la procedure stockee au dessus)

    Pb: La duree d'execution est bcp trop longue et je vois pas trop d'autres solutions pour dispatcher mes departements de facon aleatoire sur ma table de 700 000 immatriculations.

  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 839
    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 839
    Points : 52 932
    Points
    52 932
    Billets dans le blog
    5
    Par défaut
    faites cela en une requête en utilisant comme ordre aléatoire les valeurs générées par la fonction NEWID()

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

Discussions similaires

  1. comment creer un plan de maintenance sur sql server 2000
    Par sorel dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 27/12/2005, 15h03
  2. Quelques questions sur SQL Server 2000
    Par yinyang dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 07/12/2005, 19h39
  3. renseignements sur SQL Server 2000
    Par nagty dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 03/06/2005, 20h59
  4. [debutant]Auto incrementation sur sql-server 2000
    Par syl2095 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 18/11/2004, 18h00
  5. problème de float sur SQL server 2000.
    Par fidji dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 24/07/2003, 14h15

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