Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Merci
Yves
Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Merci
Yves
Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Merci
Yves
Yves T avait énoncé :Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Déjà là je vois 2 tables parcourues.
70000 lignes c'est ton produit cartésien?
Combien de clients?
Si t'as 70000 clients, ca fait 70000 requetes...;)
Et quoi comme accès non natif?
OLE DB? ODBC? ODBC Microsoft ou Oracle?
Tu ne donnes pas non plus le contenu de REQ_Factures.
Yves T avait énoncé :
Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Déjà là je vois 2 tables parcourues.
70000 lignes c'est ton produit cartésien?
Combien de clients?
Si t'as 70000 clients, ca fait 70000 requetes...;)
Et quoi comme accès non natif?
OLE DB? ODBC? ODBC Microsoft ou Oracle?
Tu ne donnes pas non plus le contenu de REQ_Factures.
Yves T avait énoncé :Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Déjà là je vois 2 tables parcourues.
70000 lignes c'est ton produit cartésien?
Combien de clients?
Si t'as 70000 clients, ca fait 70000 requetes...;)
Et quoi comme accès non natif?
OLE DB? ODBC? ODBC Microsoft ou Oracle?
Tu ne donnes pas non plus le contenu de REQ_Factures.
Debians wrote:Yves T avait énoncé :Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Déjà là je vois 2 tables parcourues.
70000 lignes c'est ton produit cartésien?
Combien de clients?
Si t'as 70000 clients, ca fait 70000 requetes...;)
Et quoi comme accès non natif?
OLE DB? ODBC? ODBC Microsoft ou Oracle?
Tu ne donnes pas non plus le contenu de REQ_Factures.
C'est Oracle 8.1.7
J'ai bien 70'000 clients
Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
fonctonnalités via Windev.
L'accès est OLE DB.
Ma requete est :
SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM =
Param_Relation
Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
Une clé composée existe sur DFAJSOC+DFAJNUM. Mais la rubrique DFAJSOC
n'existe pas dans CLIENT.
Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
Oracle.
Debians wrote:
Yves T avait énoncé :
Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Déjà là je vois 2 tables parcourues.
70000 lignes c'est ton produit cartésien?
Combien de clients?
Si t'as 70000 clients, ca fait 70000 requetes...;)
Et quoi comme accès non natif?
OLE DB? ODBC? ODBC Microsoft ou Oracle?
Tu ne donnes pas non plus le contenu de REQ_Factures.
C'est Oracle 8.1.7
J'ai bien 70'000 clients
Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
fonctonnalités via Windev.
L'accès est OLE DB.
Ma requete est :
SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM =
Param_Relation
Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
Une clé composée existe sur DFAJSOC+DFAJNUM. Mais la rubrique DFAJSOC
n'existe pas dans CLIENT.
Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
Oracle.
Debians wrote:Yves T avait énoncé :Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
ClientSafirHF est une base HF
Req_Factures est basé sur un fichier Oracle
HLitPremier(ClientsSafirHF,DRELNUM)
TANTQUE PAS HEnDehors(ClientsSafirHF)
HExécuteRequête(Req_Factures,hRequêteDéfaut,Annee,ClientsSafirHF.DRELNUM)
//si HNbEnr(Req_Factures,hEtatTous) > 0 alors
HLitPremier(Req_Factures)
SI HEnDehors(Req_Factures) = Vrai ALORS
ClientsSafirHF.ClientActif = Faux
SINON
ClientsSafirHF.ClientActif = Vrai
FIN
HModifie(ClientsSafirHF)
HLitSuivant(ClientsSafirHF)
FIN
Est-ce que quelqu'un a une proposition à me faire ??
Déjà là je vois 2 tables parcourues.
70000 lignes c'est ton produit cartésien?
Combien de clients?
Si t'as 70000 clients, ca fait 70000 requetes...;)
Et quoi comme accès non natif?
OLE DB? ODBC? ODBC Microsoft ou Oracle?
Tu ne donnes pas non plus le contenu de REQ_Factures.
C'est Oracle 8.1.7
J'ai bien 70'000 clients
Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
fonctonnalités via Windev.
L'accès est OLE DB.
Ma requete est :
SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM =
Param_Relation
Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
Une clé composée existe sur DFAJSOC+DFAJNUM. Mais la rubrique DFAJSOC
n'existe pas dans CLIENT.
Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
Oracle.
Yves T a écrit:
> Debians wrote:
>
>> Yves T avait énoncé :
>>
>>> Bonjour,
>>> C'est la 1ère fois que je traite une base Orable .. sans accès natif !
>>> Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
>>> serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
> C'est Oracle 8.1.7
> J'ai bien 70'000 clients
> Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
> d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
> fonctonnalités via Windev.
>
> L'accès est OLE DB.
>
> Ma requete est :
>
> SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
> DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
> DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM > > Param_Relation
Compte tenu de la requête, écris la dèjà de manière plus concise
(suppression des préfixes et alias inutiles):
SELECT DFAJSOC, DFAJEXE, DFAJCOD, DFAJFAC, DFAJNUM, DFAJDAT FROM DFAJ
WHERE DFAJEXE > Param_Annee AND DFAJNUM = Param_Relation
Tu économises un peu plus de 100 car pour ta requête, soit un échange
réduit de plus de 7 000 000 octets....
> Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
> Une clé composée existe sur DFAJSOC+DFAJNUM. Mais la rubrique DFAJSOC
> n'existe pas dans CLIENT.
> Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
> Oracle.
Yves T a écrit:
> Debians wrote:
>
>> Yves T avait énoncé :
>>
>>> Bonjour,
>>> C'est la 1ère fois que je traite une base Orable .. sans accès natif !
>>> Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
>>> serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
> C'est Oracle 8.1.7
> J'ai bien 70'000 clients
> Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
> d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
> fonctonnalités via Windev.
>
> L'accès est OLE DB.
>
> Ma requete est :
>
> SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
> DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
> DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM > > Param_Relation
Compte tenu de la requête, écris la dèjà de manière plus concise
(suppression des préfixes et alias inutiles):
SELECT DFAJSOC, DFAJEXE, DFAJCOD, DFAJFAC, DFAJNUM, DFAJDAT FROM DFAJ
WHERE DFAJEXE > Param_Annee AND DFAJNUM = Param_Relation
Tu économises un peu plus de 100 car pour ta requête, soit un échange
réduit de plus de 7 000 000 octets....
> Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
> Une clé composée existe sur DFAJSOC+DFAJNUM. Mais la rubrique DFAJSOC
> n'existe pas dans CLIENT.
> Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
> Oracle.
Yves T a écrit:
> Debians wrote:
>
>> Yves T avait énoncé :
>>
>>> Bonjour,
>>> C'est la 1ère fois que je traite une base Orable .. sans accès natif !
>>> Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
>>> serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
> C'est Oracle 8.1.7
> J'ai bien 70'000 clients
> Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
> d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
> fonctonnalités via Windev.
>
> L'accès est OLE DB.
>
> Ma requete est :
>
> SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
> DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
> DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM > > Param_Relation
Compte tenu de la requête, écris la dèjà de manière plus concise
(suppression des préfixes et alias inutiles):
SELECT DFAJSOC, DFAJEXE, DFAJCOD, DFAJFAC, DFAJNUM, DFAJDAT FROM DFAJ
WHERE DFAJEXE > Param_Annee AND DFAJNUM = Param_Relation
Tu économises un peu plus de 100 car pour ta requête, soit un échange
réduit de plus de 7 000 000 octets....
> Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
> Une clé composée existe sur DFAJSOC+DFAJNUM. Mais la rubrique DFAJSOC
> n'existe pas dans CLIENT.
> Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
> Oracle.
"Ph. B." a écrit dans le message de
news:42ecaf93$0$6052$Yves T a écrit:Debians wrote:Yves T avait énoncé :Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
essaie un accès natif (le mien si possible :-)) tu auras au moins la
fonction "reuse cursor" en plus.Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
[CUT]C'est Oracle 8.1.7
J'ai bien 70'000 clients
Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
fonctonnalités via Windev.
L'accès est OLE DB.
Ma requete est :
SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM >>> Param_RelationCompte tenu de la requête, écris la dèjà de manière plus concise
(suppression des préfixes et alias inutiles):
SELECT DFAJSOC, DFAJEXE, DFAJCOD, DFAJFAC, DFAJNUM, DFAJDAT FROM DFAJ
WHERE DFAJEXE > Param_Annee AND DFAJNUM = Param_Relation
C'est vrai que çà se lit un peu mieux comme celà :-)
Tu économises un peu plus de 100 car pour ta requête, soit un échange
réduit de plus de 7 000 000 octets....
C'est vrai aussi mais çà ne prend pas 3 heures :-)Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
Une clé composée existe sur DFAJSOC+DFAJNUM.
Mais la rubrique DFAJSOC
n'existe pas dans CLIENT.
C'est l'inconvénient de gérer des clés composées au lieu d'indexes non
uniques.
C'est la même chose mais les développeurs WinDev pensent souvent
que les 2 colonnes sont indexées. Pour Oracle c'est bien d'abord DFAJSOC
puis DFAJNUM qui est indexée.Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
Oracle.
En soit ce n'est pas trop le problème. Le problème serait si tu ne peux pas
modifier la base. Car dans ton cas c'est très simple il suffit de créer un
index sur DFAJNUM (voir avec ton dba si un index bitmap est adapté en
fonction de la cardinalité de cette colonne). Si la cardinalité DFAJSOC est
importante (> 100 pour chaque DFAJNUM), un index sur DFAJNUM, DFAJSOC serait
peut-etre plus adapté. Ne pas oublier de faire un compute statistics après
bien sur :-)
Si tu ne peux pas modifier la base de données désolé ta requete fera
toujours un "ACCESS FULL" sur la table (ce qui veut dire aussi que les temps
de réponses augmenteront avec ta volumétrie dans le temps!).
Sinon pour optimiser ton traitement au lieu de parcourir tes clients (HF)
puis tes factures (Oracle), tu fais le contraire... Pour toutes tes factures
lues, tu modifies le client si besoin est. Tu n'auras qu'un seul ACCESS FULL
en base soit un fetch total des factures en 15 secondes :-)
"Ph. B." <philippe_NO_._SPAM_boucault@voila.fr> a écrit dans le message de
news:42ecaf93$0$6052$626a14ce@news.free.fr...
Yves T a écrit:
Debians wrote:
Yves T avait énoncé :
Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
essaie un accès natif (le mien si possible :-)) tu auras au moins la
fonction "reuse cursor" en plus.
Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
[CUT]
C'est Oracle 8.1.7
J'ai bien 70'000 clients
Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
fonctonnalités via Windev.
L'accès est OLE DB.
Ma requete est :
SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM >>> Param_Relation
Compte tenu de la requête, écris la dèjà de manière plus concise
(suppression des préfixes et alias inutiles):
SELECT DFAJSOC, DFAJEXE, DFAJCOD, DFAJFAC, DFAJNUM, DFAJDAT FROM DFAJ
WHERE DFAJEXE > Param_Annee AND DFAJNUM = Param_Relation
C'est vrai que çà se lit un peu mieux comme celà :-)
Tu économises un peu plus de 100 car pour ta requête, soit un échange
réduit de plus de 7 000 000 octets....
C'est vrai aussi mais çà ne prend pas 3 heures :-)
Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
Une clé composée existe sur DFAJSOC+DFAJNUM.
Mais la rubrique DFAJSOC
n'existe pas dans CLIENT.
C'est l'inconvénient de gérer des clés composées au lieu d'indexes non
uniques.
C'est la même chose mais les développeurs WinDev pensent souvent
que les 2 colonnes sont indexées. Pour Oracle c'est bien d'abord DFAJSOC
puis DFAJNUM qui est indexée.
Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
Oracle.
En soit ce n'est pas trop le problème. Le problème serait si tu ne peux pas
modifier la base. Car dans ton cas c'est très simple il suffit de créer un
index sur DFAJNUM (voir avec ton dba si un index bitmap est adapté en
fonction de la cardinalité de cette colonne). Si la cardinalité DFAJSOC est
importante (> 100 pour chaque DFAJNUM), un index sur DFAJNUM, DFAJSOC serait
peut-etre plus adapté. Ne pas oublier de faire un compute statistics après
bien sur :-)
Si tu ne peux pas modifier la base de données désolé ta requete fera
toujours un "ACCESS FULL" sur la table (ce qui veut dire aussi que les temps
de réponses augmenteront avec ta volumétrie dans le temps!).
Sinon pour optimiser ton traitement au lieu de parcourir tes clients (HF)
puis tes factures (Oracle), tu fais le contraire... Pour toutes tes factures
lues, tu modifies le client si besoin est. Tu n'auras qu'un seul ACCESS FULL
en base soit un fetch total des factures en 15 secondes :-)
"Ph. B." a écrit dans le message de
news:42ecaf93$0$6052$Yves T a écrit:Debians wrote:Yves T avait énoncé :Bonjour,
C'est la 1ère fois que je traite une base Orable .. sans accès natif !
essaie un accès natif (le mien si possible :-)) tu auras au moins la
fonction "reuse cursor" en plus.Cependant, je trouve tout de même incroyable qu'il me faut 3h sur un
serveur Oracle 8, 1Go RAM, P4 3Ghz pour executer ce code :
[CUT]C'est Oracle 8.1.7
J'ai bien 70'000 clients
Ca fait bien 70'000 requêtes puisque j'attaque une base qui est celle
d'un ERP pour rapatrier des données dans une base HF afin d'ajouter des
fonctonnalités via Windev.
L'accès est OLE DB.
Ma requete est :
SELECT DFAJ.DFAJSOC AS DFAJSOC,DFAJ.DFAJEXE AS DFAJEXE,DFAJ.DFAJCOD AS
DFAJCOD,DFAJ.DFAJFAC AS DFAJFAC,DFAJ.DFAJNUM AS DFAJNUM,DFAJ.DFAJDAT AS
DFAJDAT FROM DFAJ WHERE DFAJ.DFAJEXE > Param_Annee AND DFAJ.DFAJNUM >>> Param_RelationCompte tenu de la requête, écris la dèjà de manière plus concise
(suppression des préfixes et alias inutiles):
SELECT DFAJSOC, DFAJEXE, DFAJCOD, DFAJFAC, DFAJNUM, DFAJDAT FROM DFAJ
WHERE DFAJEXE > Param_Annee AND DFAJNUM = Param_Relation
C'est vrai que çà se lit un peu mieux comme celà :-)
Tu économises un peu plus de 100 car pour ta requête, soit un échange
réduit de plus de 7 000 000 octets....
C'est vrai aussi mais çà ne prend pas 3 heures :-)Effectivement, DRELNUM n'est pas clé dans DFAJ (Factures) !!
Une clé composée existe sur DFAJSOC+DFAJNUM.
Mais la rubrique DFAJSOC
n'existe pas dans CLIENT.
C'est l'inconvénient de gérer des clés composées au lieu d'indexes non
uniques.
C'est la même chose mais les développeurs WinDev pensent souvent
que les 2 colonnes sont indexées. Pour Oracle c'est bien d'abord DFAJSOC
puis DFAJNUM qui est indexée.Ce qui n'est pas évident, c'est que j'ai pas de descriptif de cette base
Oracle.
En soit ce n'est pas trop le problème. Le problème serait si tu ne peux pas
modifier la base. Car dans ton cas c'est très simple il suffit de créer un
index sur DFAJNUM (voir avec ton dba si un index bitmap est adapté en
fonction de la cardinalité de cette colonne). Si la cardinalité DFAJSOC est
importante (> 100 pour chaque DFAJNUM), un index sur DFAJNUM, DFAJSOC serait
peut-etre plus adapté. Ne pas oublier de faire un compute statistics après
bien sur :-)
Si tu ne peux pas modifier la base de données désolé ta requete fera
toujours un "ACCESS FULL" sur la table (ce qui veut dire aussi que les temps
de réponses augmenteront avec ta volumétrie dans le temps!).
Sinon pour optimiser ton traitement au lieu de parcourir tes clients (HF)
puis tes factures (Oracle), tu fais le contraire... Pour toutes tes factures
lues, tu modifies le client si besoin est. Tu n'auras qu'un seul ACCESS FULL
en base soit un fetch total des factures en 15 secondes :-)
Merci à tous pour vos remarques et infos ... je suis passé à moins de 15
minutes !!
Bonne soirée
Yves
Merci à tous pour vos remarques et infos ... je suis passé à moins de 15
minutes !!
Bonne soirée
Yves
Merci à tous pour vos remarques et infos ... je suis passé à moins de 15
minutes !!
Bonne soirée
Yves