SQL Loader sans la moindre hésitation.
Au départ, j'avais des doutes.
Quand on est passé de 1 heure à moins de 5 minutes pour la réplication des données nécessaires au site web d'un client, le résultat fut assez flagrant pour écarter toute hipothèse d'un problème d'optimisation des lots SQL. Et pourtant, des données y'en a une tétrachiée. Certes, au départ, les données étaient mises à jour via OLEDB, avec un commit toutes les 10 000 lignes. Mais l'écart de perfs entre un script SQL et une éxécution OLEDB d'un lot de requête ne justifie pas une telle différence (au pire, 2 ou 3 fois plus lent, jamais de la vie plus de 10 )
En tout et pour tout, dans l'ordre décroissant de rapidité, on avait :
- Les select qui génèrent les fichiers
- Les transferts FTP (liaison 1Gbps)
- SQL Loader
Bon, sur un gros serveur HP sous Solaris, utilisant un SAN. Avec un serveur x86, les perfs seront certainement moindre à cause du goulot d'étranglement du PCI.
En fait, avec un SQL Loader, on ne fait que recopier brut de fonderie les données d'un fichier plat (rien de plus rapide à lire) dans les tablespace. Seul un contrôle du type est effectué, les tests d'unicité et d'intégrité n'étant faits qu'à la fin du chargement. Un peu l'équivalent de l'insertion par lot, mais en zappant complètement le moteur SQL. En bref, si ton RAID 50 est capable de bouffer 500 Mo/s (ce qu'on peut obtenir avec une vingtaine de disques réparti sur une chaîne RAID 50), alors les données seront intégrées à cette vitesse (c'est pas les tests de types qui vont réussir à ralentir les CPU actuels). Avec des insertions, même avec des commits bien gérés, à chaque insertion on va générée une chiée d'écriture et de lectures (vérification de la cohérence et des FK, lock des index, insertion des données, mise à jour des index, puis la série d'écritures générées par un COMMIT - lock de a table et des index, recopie des données temporaires dans les fichiers de données, puis unlock des index et tables -). Avec un SQL Loader, la table est de toute façon lockée pendant tout le traîtement, c'est pas rollbackable, et les index ne sont checkés/mis à jour qu'une une seule fois à la fin.
C'est un peu même chose qu'entre un "DELETE maTable" et un "TRUNCATE maTable" : le jour et la nuit 
Message édité par Arjuna le 13-10-2005 à 00:59:47