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 :

Passage de tables de grande taille


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut Passage de tables de grande taille
    bonjour a tous

    je dispose d'un PC client connecté a une base de données distante. je dois régulièrement faire plusieurs milliers d'ajouts de ligne grâce a des INSERT INTO successifs dans une boucle for, 1 requête par ligne.

    problème: c'est lent et ça bouffe de la disponibilité serveur.

    pour économiser du réseau, je souhaiterais que mes requête INSERT INTO dans boucle FOR soient faite directement sur le PC du serveur.

    j'ai pensé aux procédures stockées, mais j'ai deux contraintes: mes tables de valeurs sont grosses et leur taille n'est pas fixe. sur internet, je n'ai trouvé d'aide que concernant les petites tables a 1 ou 2 lignes.

    auriez-vous une idée? suis-je condamné a construire une requête de 8000 insert into? :'(

    merci d'avance

  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 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Pourquoi voulez-vous faire des insertions ligne par ligne ? Comment sont vos données originales ?

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

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    @SqlPro

    pas nécessairement, mais il n'y a que cela qui me vienne a l'esprit.

    ma base de données est composée d'entiers 32 bits, chaines et booleens
    mon idee est de transmettre ces données sous forme de tableau 1D, chaque tableau = 1 colonne
    -des tableaux d'entiers 32 bits signes
    -1 tableau de booléens
    -1 tableau de chaines
    puis de prendre chaque lignes de ces tableaux 1D pour créer une @table dans une boucle for, puis mettre cette @table dans ma base finale.

    question du début: comment transmettre de telles données le plus simplement possible?

  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 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Vous ne répondez pas à la question : d'ou proviennent ces données ???
    fichier ?
    calculs ?
    flux continu ???

    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 à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    les données sont des variables internes au programme qui construit les requêtes avec le contenu de ces variables. Ce n'est que du texte direct, il n'y a pas de fichiers. La requête terminée est envoyée directement par le programme.

    Je ne sais pas ce que vous entendez par "calcul" et "flux continu"
    en espérant avoir répondu precisement

  6. #6
    Membre actif
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Points : 210
    Points
    210
    Par défaut
    Bonjour,

    en quoi est écrit votre programme ? Quelle est la forme de vos clefs primaires ? autoincrement ou guid ? si autoincrement, avez-vous besoin de récupérer l'id créé pour le traiter ensuite ?
    Une fois les données insérées vous avez besoin de les mettre à jour ? ou vous ne les avez plus ? (sinon bulk en update et en delete nécessaire)

    Dans tout les cas plusieurs solutions s'offrent à vous.

    Si dotnet, alors utiliser SqlBulk, vous ne trouverez pas plus rapide pour transférer de la mémoire de votre programme vers la base de données.
    Si la base de donnée est SQL Server mais un autre langage, vous pouvez concaténer les requêtes sql avec des ";" cela augmentera les insertions.
    Si votre base de données n'est pas compatible avec les ";" (comme access ou sqlite), vous pouvez utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Insert into From
    Select 'value1','value2','value3'
    Union
    Select 'value1','value2','value3' ...
    Chaque ligne Select correspond à une ligne de votre grille. vous construisez la requête avec un srtingbuilder (sous dotnet) pour être plus rapide.

    Je n'ai pas la syntaxe exacte en tête, mais vous la retrouverez facilement sur le net.
    Une fois que vous m'aurez donné plus de précisions sur le langage je vous aiguillerai.

    Bonne chance.
    DSI et développeur du logiciel Lulidb
    http://www.lulidb.com - outils de gestion de base de données orienté développer.

  7. #7
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Je me joins au concert des demandes

    Le réponse n'est pas encore assez précise:

    1/ quelle version de SQL Server ?
    2/ d'où viennent ces valeurs dans des variables ? Le contenu de tes variables ne se crée pas tout seul, et surtout si tu parles de plusieurs milliers de lignes. Une variable scalaire contient une seul valeur, plusieurs milliers de lignes cela veut donc dire une collection, une structure de données ... quelle en est la source en amont de ton programme qui les met dans des variables ?
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

  8. #8
    Membre à l'essai
    Inscrit en
    Juillet 2007
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    en quoi est écrit votre programme
    Labview 2015
    quelle est la forme de vos clefs primaires?
    je remplis 2 tables: 1 avec cles primaire non modifiable et auto incrémentale, et une deuxième avec clé modifiable, représentant un numéro de lot unique
    Si dotnet, alors utiliser SqlBulk,
    est ce qu'on peut transferer une table entiere en un coup? si oui c'est surement ce qu'il me faut. je teste et vous tiens au jus
    1/ quelle version de SQL Server ?
    Sql server 2014 management studio
    2/ d'où viennent ces valeurs dans des variables ? ?
    les valeurs sont gérées directement dans un programme labview2015, et les lignes sont générées en conséquence
    en effet, les données sont dans des "conteneurs", mais leur valeur est mise directement dans la requête en format texte.

  9. #9
    Membre actif
    Homme Profil pro
    Directeur des systèmes d'information
    Inscrit en
    Avril 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Directeur des systèmes d'information
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 141
    Points : 210
    Points
    210
    Par défaut
    Bonjour

    Apparemment vous pouvez charger des assembly dotnet dans labview.

    http://zone.ni.com/reference/en-XX/h.../net_defaults/

    donc vous pouvez utiliser les fonctions du framworks, SqlBulkCopy sera ce qui est le plus performant je pense.

    https://msdn.microsoft.com/fr-fr/lib...v=vs.110).aspx

    Pour les clefs attentions quand vous ferez un SqlBulkCopy vous ne récupérerez pas les Id Créé, donc à vous de les relire, vous n'en avez peu être pas besoin ...

    Cordialement,
    DSI et développeur du logiciel Lulidb
    http://www.lulidb.com - outils de gestion de base de données orienté développer.

  10. #10
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 153
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    Plutôt que de faire un FOR avec un INSERT par itération, faites plutôt un FOR qui génère une unique requête de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO latable (les colonnes) values
    (valeurs ligne 1),
    (valeurs ligne 2),
    (valeurs ligne 3),
    ...
    (valeurs dernière ligne)

    Ça sera toujours plus rapide (une unique transaction).
    On ne jouit bien que de ce qu’on partage.

Discussions similaires

  1. Manipulation tables de grandes tailles
    Par didier roustand dans le forum Débutez
    Réponses: 4
    Dernier message: 18/03/2010, 11h55
  2. Réponses: 1
    Dernier message: 03/09/2007, 10h40
  3. Réponses: 1
    Dernier message: 08/08/2007, 13h19
  4. Probleme sur tables de grande taille
    Par PRODEVDZ dans le forum Bases de données
    Réponses: 2
    Dernier message: 14/06/2006, 13h39
  5. [firebird 1.5] Probleme sur tables de grande taille
    Par iguanevif dans le forum Débuter
    Réponses: 2
    Dernier message: 12/08/2004, 13h33

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