|
FORUMS PROFESSIONNELS WINDEV, WEBDEV et WINDEV Mobile |
| | | | | |
| Débuté par jgachet, 04 jan. 2005 18:23 - 6 réponses |
| |
| | | |
|
| |
| Posté le 04 janvier 2005 - 18:23 |
bonjour,
je souhaite effectuer une requete qui me permette de lire un ensemble d'enregistrement vers le haut.
la base de donnée n'est pas HP ni oracle ou une de connu, c'est une base BASIS
j'accede a cette base via de l'odbc et affiche et envoie les requetes par un programme ecrit avec windev
mon probleme est le suivant :
imaginons un fichier contenant 4 millions d'enregistrements, j'affiche à l'ecran l'enregistrement n° 2 500 100. mon but est de retrouver les 16 enregistrements imédiatement au dessus du 2 500 100° enregistrement,
soit le 2 500 003° jusqu'au 2 500 109° .
quelle fonction de sql permette une lecture a l'envers ?
sachant que je possede une solution qui consiste à lire les 16 premiers enregistrement classé dans l'ordre décroissant du n°1 au n° 2 500 109.
SELECT TOP 16 reference FROM fichier WHERE reference<= "la reference de l'enregistrement n° 2 500 100" ORDER BY reference DESC
En terme de temps de reponse, cela est extrement long (plus de 2 min quand ca fait pas un timed out) ce qui me semble tout a fait logique puisque je doi classer dans l'ordre décroissant 2 500 109 enregistrements.
Ma question est : existe t il une fonction SQL plus simple ? est ce que sur des bases de données comme Oracle ou mysql, classer dans l'ordre décroissant un tel nombre d'enregistrement prend autant de temps ?
merci de l'aide que vous pourrez apporter meme si je pense qu'il n'existe pas de solution sachant que j'ai déjà epluché un grand nombre de sites internet, mais l'espoir fait vivre.
bonne année a tous, meilleurs voeux
et merci d'avance. |
| |
| |
| | | |
|
| | |
| |
| Posté le 04 janvier 2005 - 18:34 |
je ferais dans mon WHERE une restriction : WHERE reference>2 500 003 AND reference<=2 500 109 sachant que ce champ doit être ABSOLUMENT indexé
"jerome" <jgachet@soubabere.fr> a écrit dans le message de news:41dab8b3@news.pcsoft.fr...
bonjour,
je souhaite effectuer une requete qui me permette de lire un ensemble
d'enregistrement vers le haut.
la base de donnée n'est pas HP ni oracle ou une de connu, c'est une base
BASIS
j'accede a cette base via de l'odbc et affiche et envoie les requetes par
un programme ecrit avec windev
mon probleme est le suivant :
imaginons un fichier contenant 4 millions d'enregistrements, j'affiche à
l'ecran l'enregistrement n° 2 500 100. mon but est de retrouver les 16 enregistrements imédiatement au dessus du 2 500 100° enregistrement,
soit le 2 500 003° jusqu'au 2 500 109° .
quelle fonction de sql permette une lecture a l'envers ?
sachant que je possede une solution qui consiste à lire les 16 premiers
enregistrement classé dans l'ordre décroissant du n°1 au n° 2 500 109.
SELECT TOP 16 reference FROM fichier WHERE reference<= "la reference de l'enregistrement n° 2 500 100" ORDER BY reference DESC
En terme de temps de reponse, cela est extrement long (plus de 2 min quand
ca fait pas un timed out) ce qui me semble tout a fait logique puisque je doi classer dans l'ordre décroissant 2 500 109 enregistrements.
Ma question est : existe t il une fonction SQL plus simple ? est ce que
sur des bases de données comme Oracle ou mysql, classer dans l'ordre décroissant un tel nombre d'enregistrement prend autant de temps ?
merci de l'aide que vous pourrez apporter meme si je pense qu'il n'existe
pas de solution sachant que j'ai déjà epluché un grand nombre de sites internet, mais l'espoir fait vivre.
bonne année a tous, meilleurs voeux
et merci d'avance.
|
| |
| |
| | | |
|
| | |
| |
| Posté le 04 janvier 2005 - 18:37 |
J'ai oublié de dire que c à toi de stocker les n° d'enregistrement de 1 à 2 500 100 dans le champ reference
"jerome" <jgachet@soubabere.fr> a écrit dans le message de news:41dab8b3@news.pcsoft.fr...
bonjour,
je souhaite effectuer une requete qui me permette de lire un ensemble
d'enregistrement vers le haut.
la base de donnée n'est pas HP ni oracle ou une de connu, c'est une base
BASIS
j'accede a cette base via de l'odbc et affiche et envoie les requetes par
un programme ecrit avec windev
mon probleme est le suivant :
imaginons un fichier contenant 4 millions d'enregistrements, j'affiche à
l'ecran l'enregistrement n° 2 500 100. mon but est de retrouver les 16 enregistrements imédiatement au dessus du 2 500 100° enregistrement,
soit le 2 500 003° jusqu'au 2 500 109° .
quelle fonction de sql permette une lecture a l'envers ?
sachant que je possede une solution qui consiste à lire les 16 premiers
enregistrement classé dans l'ordre décroissant du n°1 au n° 2 500 109.
SELECT TOP 16 reference FROM fichier WHERE reference<= "la reference de l'enregistrement n° 2 500 100" ORDER BY reference DESC
En terme de temps de reponse, cela est extrement long (plus de 2 min quand
ca fait pas un timed out) ce qui me semble tout a fait logique puisque je doi classer dans l'ordre décroissant 2 500 109 enregistrements.
Ma question est : existe t il une fonction SQL plus simple ? est ce que
sur des bases de données comme Oracle ou mysql, classer dans l'ordre décroissant un tel nombre d'enregistrement prend autant de temps ?
merci de l'aide que vous pourrez apporter meme si je pense qu'il n'existe
pas de solution sachant que j'ai déjà epluché un grand nombre de sites internet, mais l'espoir fait vivre.
bonne année a tous, meilleurs voeux
et merci d'avance.
|
| |
| |
| | | |
|
| | |
| |
| Posté le 04 janvier 2005 - 18:57 |
peux etre une alternative mais c'est à tester :
Tu peux les sortir sans le "ORDER BY" et les classer ensuite dans un tableau
Tiens ns au courant |
| |
| |
| | | |
|
| | |
| |
| Posté le 05 janvier 2005 - 13:13 |
le probleme que j'ai, c'est que la reference n'est pas le numéro d'enregistrement dans le fichier
mon fichier est un fichier article, et cette rubrique n'est pas la clé primaire et est bien indéxé, elle correspond à la reference fournisseur, sachant que la clé primaire est composé : - code societe - code depot - reference interne ( composé de l'abreviation du nom du fournisseur + reference fournisseur).
dans ce fichier il peut exister parfois jusqu'à 5 fois la meme reference fournisseur qui correspond pour que vous comprenniez mieux à la réference de different fournisseurs de l'article sachant qu'une reference peut correspondre par exemple à une boite de visse chez un fournisseur et a un paquet de smarties pour un autre.
je n'ai aucun moyen de connaitre le numéro d'enregistrement de la ligne de départ, donc de connaitre le fameux numéro 2 500 100.
lorsque j'autorise une recherche, un utilisateur peut composé un morceau de reference ou une reference entiere sil la connait. je parle bien de la reference fournisseur puisque la reference interne est invisible a ces utilisateurs.
ma requete est tres simple
SELECT TOP 16 * FROM fichier_article WHERE reference_fournisseur >= "reference saisie par l'utilisateur" ORDER BY reference_fournisseur
par defaut le tri est fai sur la clé primaire ce qui ne m'interesse pas puisque je travaille avec la reference_fournisseur d'ou l'utilisation du ORDER BY.
Pour des raisons de temps de réponse, je ne fait afficher dans une table windev que les 16 premiers enregistrement qui corresponde au plus pret a la reference saisie et les suivants. il est evident que si un utilisateur saisie une reference qui se situe dans les premiers enregistrements, je ne peux pas faire afficher les quatres millions qui suivent.
si il veu consulter ceux qui suivent, il possede un bouton de defilement. ici aucun probleme je refai la meme requete.
le probleme est lorqu'il souhaite visualiser les enregistrements précédants. je ne peux pas le faire remonter aussi facilement que avec les hlitprecedents etc ... |
| |
| |
| | | |
|
| | |
| |
| Posté le 06 janvier 2005 - 10:34 |
déja j'utiliserai la notion de LIKE 'code%' dans la clause WHERE de façon à ne sélectionner que les 'commencants par' (il y en aura bcp moins que des 'supérieur à') utilises-tu le fetch partiel?
"jerome" <jgachet@soubabere.fr> a écrit dans le message de news:41dbc198@news.pcsoft.fr...
le probleme que j'ai, c'est que la reference n'est pas le numéro
d'enregistrement dans le fichier
mon fichier est un fichier article, et cette rubrique n'est pas la clé
primaire et est bien indéxé, elle correspond à la reference fournisseur, sachant que la clé primaire est composé :
- code societe - code depot - reference interne ( composé de l'abreviation du nom du fournisseur + reference fournisseur).
dans ce fichier il peut exister parfois jusqu'à 5 fois la meme reference
fournisseur qui correspond pour que vous comprenniez mieux à la réference de different fournisseurs de l'article sachant qu'une reference peut correspondre par exemple à une boite de visse chez un fournisseur et a un paquet de smarties pour un autre.
je n'ai aucun moyen de connaitre le numéro d'enregistrement de la ligne de
départ, donc de connaitre le fameux numéro 2 500 100.
lorsque j'autorise une recherche, un utilisateur peut composé un morceau
de reference ou une reference entiere sil la connait. je parle bien de la reference fournisseur puisque la reference interne est invisible a ces utilisateurs.
ma requete est tres simple
SELECT TOP 16 * FROM fichier_article WHERE reference_fournisseur >= "reference saisie par l'utilisateur" ORDER BY reference_fournisseur
par defaut le tri est fai sur la clé primaire ce qui ne m'interesse pas
puisque je travaille avec la reference_fournisseur d'ou l'utilisation du ORDER BY.
Pour des raisons de temps de réponse, je ne fait afficher dans une table
windev que les 16 premiers enregistrement qui corresponde au plus pret a la reference saisie et les suivants. il est evident que si un utilisateur saisie une reference qui se situe dans les premiers enregistrements, je ne peux pas faire afficher les quatres millions qui suivent.
si il veu consulter ceux qui suivent, il possede un bouton de defilement.
ici aucun probleme je refai la meme requete.
le probleme est lorqu'il souhaite visualiser les enregistrements
précédants. je ne peux pas le faire remonter aussi facilement que avec les hlitprecedents etc ...
|
| |
| |
| | | |
|
| | |
| |
| Posté le 06 janvier 2005 - 11:28 |
je ne peux pas utiliser le Like '%' car les references ne commencent pas toutes pareil
ex : '1234'
et la reference au dessus : '056', ce qui ne pourra donc pas marcher.
quand au fetch partiel, je ne l'utilise pas. mais je vais me renseigner et voir ce que je peux faire |
| |
| |
| | | |
|
| | | | |
| | |
| | |
| |
|
|
|