ftug
Messages postés5Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention 6 mars 2006
-
27 févr. 2006 à 12:07
kadideveloppement
Messages postés2Date d'inscriptionlundi 27 octobre 2008StatutMembreDernière intervention28 octobre 2008
-
28 oct. 2008 à 10:21
Bonjour,
j'aimerai inserer dans une table des nombre de 1 à N avec le moins de requetes possible ( le serveur SQL est déjà bien chargé )
pour l'instant j'ai la methode de boucle WHILE avec une insertion a chaque passage et un compteur pour savoir la valeur a ajouter.
SET @cpt=1
WHILE @cpt<@N
begin
INSERT INTO table_enumeration ('champ_1') VALUES (@cpt)
SET @cpt = @cpt + 1
end
une autre solution serait de droper la table et faire des inserts en utilisant un id avec compteur auto-incrémentable.
je cherche a faire 1 seule requete d'insert du format:
INSERT INTO table_enumeration VALUES (SELECT ... )
pour ca, je cherche une requete SELECT qui me renvois des chiffres de 1 à N et qui ne requete sur aucune table.
je ne sais pas si c'est possible mais comme je seche un peu, je me suis dit que l'appelle de la communauté m'aiderai surement.
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 1 mars 2006 à 15:16
salut
quel est ton SGBDR ?
a ma connaissance, tu ne pourra faire cela que sous ORACLE uniquement
c'est le seul SGBDR qui permette d'utiliser les "lignes valuées", c'est a dire inserer plusieurs lignes dans une table sans faire plusieurs requete INSERT (et sans utiliser de sous requete SELECT)
par exmple sous oracle tu dois pouvoir faire
INSERT INTO matable (monchamps) VALUES (1,2,3,4)
et ca va inserer 4 lignes
mais sinon je ne vois pas d'autre solution a ton probleme
ftug
Messages postés5Date d'inscriptionvendredi 4 mars 2005StatutMembreDernière intervention 6 mars 2006 6 mars 2006 à 11:10
le but est de faire un tirage au sort.
je veux N ticket sur les M en BdD sans doublon sachant que le N et M peuvent etre proche.
je ne peut donc pas tirer un chiffre et vérifier qu'il n'a pas déjà été tiré. si N est proche de M on obtiens un tps trop grand!
malheureusement je n'ai pas les tickets en BdD seulement le nombre acheté par les utilisateurs.
la méthode de tirage est déjà faite mais j'essaye d'optimisé un peut l'insertion des tickets.
l'allgo est comme ceci:
- on récupère le nombre total de tickets vendu
- on insert chaque ticket en BdD avec son numéro <-- c'est la que j'aurais besion d'une optimisation
- je fait un select TOP M tickets ORDER BY newid() pour avoir les tickets gagnants rangé aléatoirement
- je fait une recherche pour chaque ticket sur les utilisateurs afin de trouvé a qui il apartient
- je donne son cadeau a l'utilisateur
- je passe au ticket suivant
le reste de l'algo est suffisament optimisé a mon gout mais l'insert de 5000 ou 20000 enrengistrement dans une boucle WHILE me dérange bcp!
merci de l'interet que vous portez a mon problème.
Vous n’avez pas trouvé la réponse que vous recherchez ?
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 6 mars 2006 à 15:34
tout depend du programme qui va inserer ces lignes.
mais je pense que tu pourra gagner du temps en utilisant le bulk insert :
tu genere un fichier avec le contenu de ta table, puis tu l'injecte dans la table cible, d'un seul coup. c'est tres rapide, et 20000 lignes, ca ne prendra que quelques secondes.