Précédent   Forum des professionnels en informatique > Bases de données > Oracle > Interfaces de programmation
Interfaces de programmation Forum d'entraide sur l'utilisation des API Oracle : Pré-compilateurs, OCI, OCCI, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/05/2006, 08h49   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2004
Messages : 37
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 37
Points : 14
Points : 14
Par défaut [API C] se connecter sous Oracle : optimisation

Bonjour,

J'utilise le précompilateur "PROC" pour générer des ressources C me permettant de me connecter sur une base ORACLE et d'effectuer des requêtes en C.

Mon but est de charger une table oracle dans un tableau mémoire en C et de l'exploiter par la suite. J'ai donc déclaré un curseur puis effectuer des fetchs pour remplir mon tableau (ex : select ..liste de tous mes champs... from TABLE). Tout marche très bien mais je constate des problèmes de performances.

A vrai dire, j'ai testé cette solution qui est plus rapide :
- j'exécute un script SQL qui génére un fichier plat de ma table oracle avec la commande suivante : sqlplus SA/SASASA@TNR01 @script.sql
set space 0 ;
set linesize 3000 ;
set trimspool on ;
set pagesize 0 ;
set echo off ;
set heading off ;
set feedback off ;
set termout off ;
set verify off ;
set colsep '#';
spool tp2_ict01_wrk.txt;
select * from tp2_ict01_wrk;
spool off ;
quit;

- ensuite, j'ouvre le fichier tp2_ict01_wrk.txt en C et lit ligne par ligne en découpant les lignes en token pour charger mon tableau mémoire.

Cette solution me permet de gagner 25% de temps sur ce que j'ai prévu.

En somme, j'utilise la performance de l'outil SQLPLUS pour m'en sortir au mieux. Si j'arrivais à coder une partie de code en C m'envoyant les lignes une lignes sans passer par ce fichier plat, je gagnerai bien plus de temps.

Mais je ne sais pas comment m'en sortir. Auriez-vous une idée ou des pistes que je puisse exploiter ?

Merci d'avance.

Kévin
fages est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2006, 21h34   #2
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Une piste pour une utilisation rapide de l'OCI (Oracle Call Interface) en langage C par Tom Kyte: http://asktom.oracle.com/pls/ask/f?p...A:459020243348
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/05/2006, 23h16   #3
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Il suffit de faire un batch fetch:

http://download-west.oracle.com/docs...htm#sthref1232
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2006, 13h54   #4
Candidat au titre de Membre du Club
 
Inscription : mars 2004
Messages : 37
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 37
Points : 14
Points : 14
Pifor> J'ai testé la solution présent dans le lien que tu a inscrit.

Effectivement, j'ai gagné en performance mais la solution de passer par un spool puis d'exploiter le fichier C est plus rapide.

Je vous remercie pour vos réponse et vais adopter la solution que j'avais décrite.

Kévin
fages est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2006, 19h14   #5
Membre expérimenté

 
Avatar de plabrevo
 
Inscription : décembre 2005
Messages : 541
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 541
Points : 598
Points : 598
Passer par SQL*Plus pour faire un bulk fetch n'a aucun sens. SQL*PLus, par ailleurs lui-meme ecrit en C, ne peut que rajouter de l'overhead, et utiliser un fichier plat comme etape intermediaire devrait penaliser encore plus les performances.
plabrevo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2006, 22h08   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2004
Messages : 37
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 37
Points : 14
Points : 14
> plabrevo : je suis bien d'accord avec toi mais pour l'instant je ne suis pas arrivé à coder un programme aussi rapide que SQL*PLUS.

Pour une table de 80 000 lignes avec 10 colonnes :
- SQL*PLUS met 20 secondes + 1 à 2 secondes pour exploiter le fichier
- Ma 1ère méthode met 35 secondes
- En utilisant la méthode décrit dans le post de pifor, je descends à 29 secondes.

A moins qu'une personne est à me proposer un code aussi rapide que SQL*PLUS écrit en Pro*C, je n'ai plus qu'à utiliser la méthode avec SQL*PLUS
fages est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h20.


 
 
 
 
Partenaires

Hébergement Web