Question

J'ai une table avec des lignes 30.000.000 ~ que je dois parcourir, manipuler les données pour chaque ligne individuellement, puis enregistrez les données de la ligne de déposer sur un lecteur local.

Quelle est la manière la plus efficace de boucle à travers toutes les lignes de la table en utilisant SQL pour Oracle? J'ai été googler, mais ne vois aucun moyen simple de faire cela. S'il vous plaît aider. Gardez à l'esprit que je ne connais pas le nombre exact de lignes, seulement une estimation.

MODIF.NUMERO CLARIFICATION:

Nous utilisons je crois que Oracle 10g. Les données de la ligne contient des données blob (fichiers texte compressé et les fichiers xml) qui seront lus en mémoire et chargés dans un objet personnalisé, où il sera ensuite mis à jour / converties en utilisant des classes d'accès .Net DOM, rezipped et stockés sur un lecteur local .

Je n'ai pas beaucoup d'expérience de base de données que ce soit - je comptais utiliser des instructions SQL droites avec ADO.Net + OracleCommands. Aucune restriction de performance vraiment. Ceci est à usage interne. Je veux juste faire la meilleure façon possible.

Était-ce utile?

La solution

Vous devez lire 30m lignes d'un DB Oracle et d'écrire des fichiers de 30 m de blobs (un fichier XML / texte compressé dans une colonne BLOB par ligne?) Dans chaque ligne du système de fichiers sur l'ordinateur local?

La solution évidente est d'ouvrir un DataReader ADO.NET sur SELECT * FROM tbl WHERE <range> afin que vous puissiez faire des lots. Lire le blob du lecteur dans votre API, faites vos trucs et d'écrire le fichier. Je probablement essayer d'écrire le programme afin qu'il puisse fonctionner de nombreux ordinateurs, chacun faisant leurs propres gammes - votre goulot d'étranglement est le plus susceptible d'être le dézipper, la manipulation et le rezipping, car de nombreux consommateurs peuvent probablement flux de données de ce tableau de le serveur sans effet notable sur les performances du serveur.

Je doute que vous serez en mesure de le faire avec interne à la base de données Oracle opérations à base de set, et je voudrais aussi penser au système de fichiers et comment vous allez organiser autant de fichiers (et si vous avez l'espace -. rappelez-vous la taille occupée par un fichier sur un système de fichiers est toujours un multiple de la taille du bloc du système de fichiers)

Autres conseils

Ma solution initiale était de faire quelque chose comme ça, comme je l'ai accès à un numéro d'identification (pseudocode):

            int num_rows = 100;
            int base = 0;
            int ceiling = num_rows;

            select * from MY_TABLE where id >= base and id < ceiling;
            iterate through retrieved rows, do work,
            base = ceiling; 
            ceiling += num_rows;
            select * from MY_TABLE where id >= base and id < ceiling;
            iterate through retrieved rows, do work,
            ...etc.

Mais je pense que cela pourrait ne pas être le plus efficace ou la meilleure façon de le faire ...

Vous pouvez essayer d'utiliser des requêtes ROWNUM pour attraper des morceaux jusqu'à ce que vous prenez morceau qui n'existe pas.

Ceci est un bon article sur les requêtes ROWNUM: http://www.oracle.com/ TechNetwork / numéro-archive / 2006/06-sep / o56asktom-086197.html

Si vous ne vous sentez pas comme la lecture, passez directement à la section « Pagination avec rownum » à la fin d'une requête par exemple.

Il est toujours préférable d'utiliser des opérations à base mis en travaillant avec un grand nombre de lignes.

Vous pouvez ensuite profiter d'un avantage de performance. Après le traitement des données, vous devriez être en mesure de transférer les données de la table dans un fichier en une seule fois.

La viabilité de cela dépend du traitement que vous devez effectuer sur les lignes, bien qu'il soit possible dans la plupart des cas pour éviter d'utiliser une boucle. Y at-il une exigence spécifique qui vous empêche de traiter toutes les lignes à la fois?

Si itérer les lignes est inévitable, en utilisant la liaison en vrac peut être bénéfique. FORALL opérations en vrac ou en vrac pour COLLECT « select into » requêtes

On dirait que vous avez besoin de l'ensemble de ces données avant vous pouvez faire toute manipulation de données, car il est un blob>. Je voudrais simplement utiliser un DataAdapter.Fill puis remettre l'ensemble de données vers l'objet personnalisé à itérer, faites-est de la manipulation puis écrire sur le disque l'objet final, puis zip.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top