OVH Cloud OVH Cloud

Faire des INSERT nombreux plus rapidement ?

4 réponses
Avatar
[[ Olivier ]]
Bonjour

Je dois récuperer des données.
J'ai dans un premier temps, créé un fichier .SQL avec dedans beaucoup de
requete INSERT
ensuite je vais dans SQL et avec Analyser, j'ouvre le fichier j'execute.

Mais c'est long..... + de 30 minutes et si c'est pas bon... Paff ! faut
recommencer !

Est-ce qu'il existe une autre méthode, plus rapide ?
J'ai vu quelque part BULK ?
Est-ce plus rapide ? Est-ce que des commandes T-SQL sont prisent en compte
avec BULK ?

Merci
Olivier

4 réponses

Avatar
TLE91
Bonjour,

Le plus simple en T-SQL pour faire de l'insertion en masse est d'utiliser
BULK INSERT. La différence avec l'éxécution de plein d'INSERT à la suite est
qu'il faut mettre les données à insérer dans un fichier texte avec un
séparateur de champs standard (du genre point-virgule). Pour voir toutes les
possibilités et des exemples d'utilisation, voir le Book On line de SQL
Server.
Il existe également un utilitaire en ligne de commande (en clair sous dos)
qui s'appelle bcp.exe, dont le fonctionnement est proche du BULK INSERT (les
paramètres de connexion à la base en plus).
Néanmoins pour l'INSERT massif (combien de lignes au fait ?), le
ralentissement peu également provenir du fait que la table où vous insérer
possède des index. Cette règle est également valable avec BULK INSERT et bcp.
En effet, un "insert" massif doit se faire dans une table non indexée
(l'indexation se fait après) sous peine de perte de performance.

Espérant vous avoir aidé.

"[[ Olivier ]]" a écrit :

Bonjour

Je dois récuperer des données.
J'ai dans un premier temps, créé un fichier .SQL avec dedans beaucoup de
requete INSERT
ensuite je vais dans SQL et avec Analyser, j'ouvre le fichier j'execute.

Mais c'est long..... + de 30 minutes et si c'est pas bon... Paff ! faut
recommencer !

Est-ce qu'il existe une autre méthode, plus rapide ?
J'ai vu quelque part BULK ?
Est-ce plus rapide ? Est-ce que des commandes T-SQL sont prisent en compte
avec BULK ?

Merci
Olivier





Avatar
[[ Olivier ]]
Effectivement, la table a des index ==> donc je les mettrai après
Le plus gros contient environ 400 000 INSERT

Je vais essayer le BULK INSERT
merci pour les infos

Olivier


"TLE91" a écrit dans le message de news:

Bonjour,

Le plus simple en T-SQL pour faire de l'insertion en masse est d'utiliser
BULK INSERT. La différence avec l'éxécution de plein d'INSERT à la suite
est
qu'il faut mettre les données à insérer dans un fichier texte avec un
séparateur de champs standard (du genre point-virgule). Pour voir toutes
les
possibilités et des exemples d'utilisation, voir le Book On line de SQL
Server.
Il existe également un utilitaire en ligne de commande (en clair sous dos)
qui s'appelle bcp.exe, dont le fonctionnement est proche du BULK INSERT
(les
paramètres de connexion à la base en plus).
Néanmoins pour l'INSERT massif (combien de lignes au fait ?), le
ralentissement peu également provenir du fait que la table où vous insérer
possède des index. Cette règle est également valable avec BULK INSERT et
bcp.
En effet, un "insert" massif doit se faire dans une table non indexée
(l'indexation se fait après) sous peine de perte de performance.

Espérant vous avoir aidé.

"[[ Olivier ]]" a écrit :

Bonjour

Je dois récuperer des données.
J'ai dans un premier temps, créé un fichier .SQL avec dedans beaucoup de
requete INSERT
ensuite je vais dans SQL et avec Analyser, j'ouvre le fichier j'execute.

Mais c'est long..... + de 30 minutes et si c'est pas bon... Paff ! faut
recommencer !

Est-ce qu'il existe une autre méthode, plus rapide ?
J'ai vu quelque part BULK ?
Est-ce plus rapide ? Est-ce que des commandes T-SQL sont prisent en
compte
avec BULK ?

Merci
Olivier







Avatar
AB
bonjour,
Tu as d'autres possibilités. Notamment le insert/ select.
Insert Into ma_table_destination (colonnes_de_ma_table_destination) (select
colonnes from ma_table_données)

Normalement ce n'est pas long du tout c'est de l'ordre de 3 à 5 min.

Si c'est trop long à cause des index. Il faut supprimer les index, faire ton
insertion et ensuite les recréer. Ne le fais pas d'une façon manuelle;
Fais-le par script. ça permet de rejouer son script autant de fois que cela
est possible.

AB

"[[ Olivier ]]" a écrit :

Effectivement, la table a des index ==> donc je les mettrai après
Le plus gros contient environ 400 000 INSERT

Je vais essayer le BULK INSERT
merci pour les infos

Olivier


"TLE91" a écrit dans le message de news:

> Bonjour,
>
> Le plus simple en T-SQL pour faire de l'insertion en masse est d'utiliser
> BULK INSERT. La différence avec l'éxécution de plein d'INSERT à la suite
> est
> qu'il faut mettre les données à insérer dans un fichier texte avec un
> séparateur de champs standard (du genre point-virgule). Pour voir toutes
> les
> possibilités et des exemples d'utilisation, voir le Book On line de SQL
> Server.
> Il existe également un utilitaire en ligne de commande (en clair sous dos)
> qui s'appelle bcp.exe, dont le fonctionnement est proche du BULK INSERT
> (les
> paramètres de connexion à la base en plus).
> Néanmoins pour l'INSERT massif (combien de lignes au fait ?), le
> ralentissement peu également provenir du fait que la table où vous insérer
> possède des index. Cette règle est également valable avec BULK INSERT et
> bcp.
> En effet, un "insert" massif doit se faire dans une table non indexée
> (l'indexation se fait après) sous peine de perte de performance.
>
> Espérant vous avoir aidé.
>
> "[[ Olivier ]]" a écrit :
>
>> Bonjour
>>
>> Je dois récuperer des données.
>> J'ai dans un premier temps, créé un fichier .SQL avec dedans beaucoup de
>> requete INSERT
>> ensuite je vais dans SQL et avec Analyser, j'ouvre le fichier j'execute.
>>
>> Mais c'est long..... + de 30 minutes et si c'est pas bon... Paff ! faut
>> recommencer !
>>
>> Est-ce qu'il existe une autre méthode, plus rapide ?
>> J'ai vu quelque part BULK ?
>> Est-ce plus rapide ? Est-ce que des commandes T-SQL sont prisent en
>> compte
>> avec BULK ?
>>
>> Merci
>> Olivier
>>
>>
>>





Avatar
Sébastien GROSBOIS \(Microsoft France\)
Attention, tout de même, un insert de 400 000 est entièrement loggé dans le
journal de transactions avec un impact conséquent sur les performances
(surtout en cas de rollback) et un risque de fort accroissement de la taille
du journal.

Le scénario le plus efficace est le suivant :

1° Il faut vérifier que la base dans laquelle on importe soit en RECOVERY
MODEL = SIMLE ou BULK (dans ce cas l'ordre BULK et les créations d'index ne
sont pas loggés dans le journall). Eventuellement vous pouvez basculer
temporairement dans ces modes le temps d'effectuer l'import puis rebasculer
dans le mode initial ensuite
2° Supprimer tous les index de la table cible
3° Faire un BULK INSERT avec le mode TABLOCK activé (très efficace mais pose
un verrou exclusif sur toute la table)
4° Recréer les index

Remarque : Le BULK est plus (un peu) efficace que le BCP.

Dans certains cas où vous êtes obligez de faire des INSERT plutôt qu'un
BULK, on recommende de faire des insertions par lot (en utilsant ROWCOUNT).
Par exemple, faire des insertions pas lot de 10000 lignes celà reste très
efficace (car ensembliste) mais celà permet de contenir la taille du journal
de transactions. Les remarques sur les index et recovery model s'appliquent
également.

Cordialement


"AB" wrote in message
news:
bonjour,
Tu as d'autres possibilités. Notamment le insert/ select.
Insert Into ma_table_destination (colonnes_de_ma_table_destination)
(select
colonnes from ma_table_données)

Normalement ce n'est pas long du tout c'est de l'ordre de 3 à 5 min.

Si c'est trop long à cause des index. Il faut supprimer les index, faire
ton
insertion et ensuite les recréer. Ne le fais pas d'une façon manuelle;
Fais-le par script. ça permet de rejouer son script autant de fois que
cela
est possible.

AB

"[[ Olivier ]]" a écrit :

Effectivement, la table a des index ==> donc je les mettrai après
Le plus gros contient environ 400 000 INSERT

Je vais essayer le BULK INSERT
merci pour les infos

Olivier


"TLE91" a écrit dans le message de
news:

> Bonjour,
>
> Le plus simple en T-SQL pour faire de l'insertion en masse est
> d'utiliser
> BULK INSERT. La différence avec l'éxécution de plein d'INSERT à la
> suite
> est
> qu'il faut mettre les données à insérer dans un fichier texte avec un
> séparateur de champs standard (du genre point-virgule). Pour voir
> toutes
> les
> possibilités et des exemples d'utilisation, voir le Book On line de SQL
> Server.
> Il existe également un utilitaire en ligne de commande (en clair sous
> dos)
> qui s'appelle bcp.exe, dont le fonctionnement est proche du BULK INSERT
> (les
> paramètres de connexion à la base en plus).
> Néanmoins pour l'INSERT massif (combien de lignes au fait ?), le
> ralentissement peu également provenir du fait que la table où vous
> insérer
> possède des index. Cette règle est également valable avec BULK INSERT
> et
> bcp.
> En effet, un "insert" massif doit se faire dans une table non indexée
> (l'indexation se fait après) sous peine de perte de performance.
>
> Espérant vous avoir aidé.
>
> "[[ Olivier ]]" a écrit :
>
>> Bonjour
>>
>> Je dois récuperer des données.
>> J'ai dans un premier temps, créé un fichier .SQL avec dedans beaucoup
>> de
>> requete INSERT
>> ensuite je vais dans SQL et avec Analyser, j'ouvre le fichier
>> j'execute.
>>
>> Mais c'est long..... + de 30 minutes et si c'est pas bon... Paff !
>> faut
>> recommencer !
>>
>> Est-ce qu'il existe une autre méthode, plus rapide ?
>> J'ai vu quelque part BULK ?
>> Est-ce plus rapide ? Est-ce que des commandes T-SQL sont prisent en
>> compte
>> avec BULK ?
>>
>> Merci
>> Olivier
>>
>>
>>