dupliquer une table sql

dupliquer une table sql - SQL/NoSQL - Programmation

Marsh Posté le 12-10-2005 à 10:42:10    

bonjour,
 
je dois dans un executable dupliquer une table sql d'une base a une autre
quel est le meilleur moyen
 
je pensais a une procedure PL/SQL (je suis en oracle) qui parcour tout les enregistrements de la table a copier (avec un databaseLink)
dans un curseur
puis de tout inserer dans la table de reception
 
merci  :hello:

Reply

Marsh Posté le 12-10-2005 à 10:42:10   

Reply

Marsh Posté le 12-10-2005 à 10:45:09    

je comprends pas
pourquoi faire ca en PL/SQL?
une simple creation de table a partir du select de la table source ne te convient pas?

Reply

Marsh Posté le 12-10-2005 à 10:52:08    

create table matable as select * from MaTableaCopie@dblink;
 
 
comme ca? oui kler je voyais le trop d'une maniere trop complexe ;)

Reply

Marsh Posté le 12-10-2005 à 10:53:50    

non en faite les tables seront deja crée, ca va peu etr pas marcher le create table (pour les jointures etc...)
 
je vais peu etre faire ca alors:
INSERT INTO MaTableCopie (var1, var2, ....) SELECT var1, var2, .... FROM MaTable;

Reply

Marsh Posté le 12-10-2005 à 10:56:55    

INSERT INTO MaTableCopie SELECT * FROM MaTable devrait suffire non


Message édité par betsamee le 12-10-2005 à 10:57:10
Reply

Marsh Posté le 12-10-2005 à 11:02:12    

kler merci pour ton aide.  
 

Reply

Marsh Posté le 12-10-2005 à 15:57:56    

seul souci du create as select, c'est que si la table est trop grosse tu risque un rollback segment. mais sinon, c'est la meilleur solution.
 
autre solution, qui ne risque rien, et bien plus rapide : génération d'un fichier plat au format SQL Loader, puis un coup de SQL Loader et là tu pleures en voyant ta table de 100 000 000 être recopiée en 5 secondes ;)

Reply

Marsh Posté le 12-10-2005 à 16:05:55    

5 secondes pour 100 millions de lignes, faut pas exagérer :D
 
D'ailleurs, je me demande ce qui serait le plus rapide entre passer par SQL Loader ou du PL/SQL avec COMMITs régulier, pour copier une grosse table ... à tester.

Reply

Marsh Posté le 13-10-2005 à 00:49:12    

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
Reply

Marsh Posté le 13-10-2005 à 10:40:36    

Mais pas le meme niveau de securité.


---------------
MZP est de retour
Reply

Marsh Posté le 13-10-2005 à 10:40:36   

Reply

Marsh Posté le 13-10-2005 à 20:41:35    

?
 
Ben si, car SQL Loader marche comme suit :
- LOCK de la table.
- Insertion des données dans le table space
- Mise à jour des index et contrôles des FK
- Connection des données inserrées à la table elle-même.
- UNLOCK de la table.
 
Donc si la régénération des index plante, alors les données ne sont jamais liées à la table, et donc c'est comme si on n'avais rien fait.
 
En fait, clairement, mise à part si on a des triggers, y'a aucune différence de comportement par rapport à des INSERT, mise à part que c'est incomparablement plus rapide.


Message édité par Arjuna le 13-10-2005 à 20:42:13
Reply

Marsh Posté le 14-10-2005 à 07:46:16    

non je parle du DELETE et du TRUNCATE. L'un log et l'autre non.


---------------
MZP est de retour
Reply

Marsh Posté le 14-10-2005 à 19:20:56    

ah ok :)
 
me SQL Loader non plus ne log pas d'ailleurs. Le seul truc, comme le TRUNCATE, c'est qu'en cas de plantage pour données incohérentes, le contenu de la table n'est pas altéré :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed