SQLCMD + DELETE

Résolu
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 - 7 août 2006 à 12:25
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 - 8 août 2006 à 12:59
Salut a tous

voila j'execute un fichier a l'aide de sqlcmd dans lequel se trouve plusieur instruction DELETE.

voici le format de mon fichier

USE [MABASE]
Go
DELETE..... ;
Go
DELETE..... ;
Go
......

et voici la commende que je lance

sqlcmd -E -S[server] -ic:\test\fic.sql

Lorsque je le lance il me met comme message
"le contexte de la base de données a changé; il est maintenant 'MABASE' "

et puis il reste comme ca

pour info ma table sur laquelle je fais mes delete contient + de 7millions de ligne

Dc 1ere question
est-ce-que mon fichier est bien formaté ou pas? et si quelqu'un pouvait m'envoyer un exemple ca serai cool

2eme question
est ce que c'est normal que ca mette autant de tps? et est-ce qu'il existe un moyen plus rapide pour faire mes DELETE?????

Merci a toussssssssssssss

13 réponses

cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
7 août 2006 à 18:11
Ok, dans ce cas j'ai compris c'est dans doute que la table n'a pas d'index et / ou de clef primaire et san doute pas sur le champ qui sert à faire la sélection pour le DELETE.


Il faudrait alors créer un index sur le champ qui est présent dans le WHERE du DELETE, celà peut prendre quelques minutes, puis relancer le script celà devrait alors être quasi-instantané.


S'il y a des connexions sur d'autres bases sur le même serveur ce pas très gênant... Normalement on ne verra pas la différence.
Ce qui aurait pu l'être c'est un utilisateur qui lit des données, dans ce cas le DELETE attend !

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
3
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
7 août 2006 à 13:02
Personnellement je parie sur la lenteur du DELETE, un DELETE sur 7 millions d'enregistrements est nécessairement "un peu" lent. Il faudrait à mon avis découper le DELETE en blocs.

Par exemple au lieu de :

DELETE FROM MaTable

Ceci :

DELETE FROM MaTable WHERE Id BETWEEN @debid AND @finid

Avec une boucle... WHILE par exemple autour
Les DELETE sur une très grosse quantité de données sont en général une assez mauvaise idée, c'est pour cela qu'on fractionne.
De plus cela permettra d'avoir la progression de la suppression.

Sinon pour l'appel de sqlcmd et la structure du fichier je trouve que c'est bon.

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
7 août 2006 à 13:08
merci pour la reponse

en fait je fai pas un delete sur les 7million d'enregistrement je le fait que sur certain

Delete from table where id = '1';
Go
Delete from table where id = '125';
Go
etc....

donc les delete sont bien séparés. je ne fai pas de delete sur un bloc

le fichier je le cré via un prog qui determine les enregistrement a supprimé.

pr ce qui est de la lenteur c'est entre le message qui me dit /auteurdetail.aspx?ID=639972
"le contexte de la base de données a changé; il est maintenant 'MABASE' "

et le moment ou le lancement du 1er delete se fait ca met plus de 5min et dc j'arrete le processus
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
7 août 2006 à 13:20
Pendant l'execution du DELETE il n'y aurait rien d'autre qui bloquerait ?


Par exemple un SELECT fait sur le même table ?

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
7 août 2006 à 13:22
nan ds mon fichier je n'ai ke des delete

mais le sqlcmd ne fait -il pas un select * de la table pr la charger en memoire???
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
7 août 2006 à 14:42
Mais non, c'est pas ce que je voulais dire... Et non il ne fait pas de SELECT.

Est ce qu'il y aurait un autre utilisateur ou une autre application connecté sur la même base de données et qui ferait des opérations sur la même table ?

Sinon essaye de toi même de connecter avec sqlcmd et execute les lignes une à une pour voir le résultat.

Pour avoir des infos sur qui est actuellement connecté la procedure stockée sp_who permet de donner la liste des sessions en cours sur le serveur (Seul les SPID > 50 nous interesse).

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
7 août 2006 à 15:19
alors pour les personnes connecté je peut te le dire ya personne a par moi

j'ai quand meme verifier au cas ou LOL

jvien de tester avec plusieur ligne apparement ben ca marche normalment j'ai collé tout un bloc de 10 delete et ca a pris kelke seconde
0
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
7 août 2006 à 15:28
ya aussi le fait que j'ai 2/3 fichiers a lancé les un apres les autres et qui font la meme chose mais sur des tables differentes.

au debut pr le 1er fichier c plutot rapide et apres ca deviens plus long pour les fichier suivant (sachant que les tables sont plus importantes les unes que les autres)

j'ai vraiment l'impression que plus la table est grosse plus il met du temps a traité les choses
0
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
7 août 2006 à 16:22
j'ai une autre question(et precision a apporter)

la base se trouve sur une machine windows serveur  jme connecte a la machine en tant qu'admin et je travaille directement dessus. est ce que si d'autre personne se connecte a d'autres bases du serveur SQL en tant qu'admin ca pe provoquer ce ralenti????
0
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
8 août 2006 à 09:34
deux de mes tables possèdes des clé primaires
sur les deux autres ce n'est pas possibles car le champs utilisé dans le where n'est pas unique et je ne possède aucun champs unique dans ces tables.

Est ce que le champs doit etre unique si je veux l'indexé???

en tout cas merci pour ton aide
0
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
8 août 2006 à 11:51
est ce que en faisant une transaction ca irai beaucoup plus vite???

si oui pourrai tu m'expliquer comment on ecrit une transaction. avec un exemple stp
0
cs_skweeky Messages postés 259 Date d'inscription mercredi 3 mai 2006 Statut Membre Dernière intervention 11 janvier 2010 8
8 août 2006 à 12:57
Un index n'est pas nécessairement unique, il ne doit pas contenir trop de doublons tout de même.


Avec une transaction çà ne changera rien aux perf çà sera peut être pire même.

Christian Robert - Winwise
http://blogs.developpeur.org/christian/
MCT - Database Development / Database Administration
0
yanis7518 Messages postés 283 Date d'inscription mercredi 7 décembre 2005 Statut Membre Dernière intervention 9 juillet 2010 3
8 août 2006 à 12:59
bon alors j'ai pas de solution. en tout cas merci pour ton aide skweeky c'est sympa.
0
Rejoignez-nous