La Paradox PARADOX

alicia_3107 Messages postés 4558 Statut Membre -  
alicia_3107 Messages postés 4558 Statut Membre -
Un simple filtre appliqué sur Une table PARADOX de 40000 enregistrements prend 2 minutes
A voir également:

11 réponses

Utilisateur anonyme
 
Hi Alicia,

paradox ! tu parlais d'SQL ou une méthode ? je voudrais dire le filtre est réalisé par un Order By ou un programme que tu as écrit toi même..!

note :

la vitesse d'execution dépend de :

- ton PC,
- de la méthode,
- et du Task ( les programmes qui tourne en RealTime ) comme un Antivirus,...

a bientot sur CCM.. :-))

[ Ton Doux Visage. ]
0
alicia_3107 Messages postés 4558 Statut Membre 6
 
Le simple filtre en question

table1.filter := ' DATE < '''+DateToStr(DATE())+''' ';
table1.filtered := True;
0
Utilisateur anonyme
 
bonjour, Alicia..

Utiliser un Query , un Batchmove et une table incluant un fichier temporaire. je crois que le Sql est plus rapide que l'utilisation des tables... !!

je serais ici ce soir.. bye :-)

[ Ton Doux Visage. ]
0
alicia_3107 Messages postés 4558 Statut Membre 6
 
En fait, avec SQL et ses requêtes c'est pire que tout, c'est encore plus long que long ... 8(
0
Marmot Messages postés 580 Statut Membre 69
 
Bête question, tu attaques ça dans quel langage ?
0
Utilisateur anonyme
 
ben c'est speed is Delphi (c) Borland production. :-)


[ Ton Doux Visage. ]
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
 
me revoila Alicia :)-

Note :

Avant de débuter cette solution je précise que le champ DATE est généralement rejeté par les models conceptuels des SI car il est considéré comme un Polyséme (ãÊÚÜÜÏÏ ÇáãÚÊÜÜäí). Comme le Sql possède lui aussi un mot réservé DATE permettant la convertion d'une date-longue* en une autre courte, bien qu'il existe le mot réservé CAST qui permet de diminuer ce format de date..

Donc il est préférable de changer la syntaxe (la règle d'intégrité) de la Date dans ta structure de la BDD soit : DATEN, DATEF, DATEC et de cette manière on passe à la phase de réalisation :

* Date-longue = MM/DD/YYYY HH:mm:ss,dd (retourné via une interruption du BIOS à l'OS )

Phase 1 :

- insérer un Query
- spécifier son DatabaseName (Dossier ou Alias)
- dans l'Sql injecter le code Sql suivant :

Select....
From...
Where Daten < :Y
Order By Daten

- ensuite configurer ton Params (paramètres) soit le Y est un Input et le type est une Date,

Phase 2 : le teste

- insérer un DBGRID
- insérer un DataSource
- relier DataSource1 au Query1 via DataSet
- relier le DBGrid1 au DataSource1 via DataSource

- Ajouter un DateTimePicker (voir l'onglet Supplément)
- Ensuite un bouton pour actionner la méthode..
- 2xClique sur le Buton,

Phase 3 : le Code source

Begin

Query1.Close;

Query1.ParamByName('Y').Value := StrToDate ( DateToStr ( DateTimePicker1.Date ) );

Query1.Open;

End;

- si tu veux changer la date de comparaison par Date(), ôter le DateTimePicker est changer le code de la méthode.

bonne chance Alicia.. :-)

[ Ton Doux Visage. ]
0
Utilisateur anonyme
 
Technique :

J'ajoute aussi que les méthodes de programmation sont multiples, il suffit l'idée non seulement et en priorité le langage. Si c'est le cas pour moi, je fait exploser la BDD en dix (10) répertoires (équivalent à 10 ans expl : de 2000 jusqu'à 2010), puis, chaque répertoire divisé en douze (12) sous répertoires (équivalent à 12 mois pour chaque année),.. j'ajoute une routine pour sa gestion, et surtout une garantie de 10 ans de mon Soft.. :-)
De cette façon, la condition Daten < :x implique que nous sommes à la même année, le filtre se base plutôt sur le jour et le mois, l'accès est directe et le temps et insoupçonnable.

je dirais que la BDD ne peut accéder les 40 000 records pour la même année.

en tout cas, il faut apprendre toutes les méthodes de programmation (bien que la ruse informatique) pour que tu puisse développer aisément.

[ Ton Doux Visage. ]
0
alicia_3107 Messages postés 4558 Statut Membre 6
 
Merci de proposer des solutions aussi interessantes, C'est sûr que si je fragmente ma table en sous tables périodiques je règlerai le problème mais je ne répondrai pas à ma question qui est quand même fondamentale : Est ce qu'on ne peut pas travailler normalement avec une table de l'ordre d'un millier d'enregistrements et plus ? Personnellement, je ne pense pas, je suis sûr qu'il existe quelque part (je ne sais pas où) une configuration à modifier pour augmenter la vitesse de traitement, il s'agit quand même d'un trés simple filtre, appliqué sur un champ date, caractère ou autre, le temps d'exécution est trop long et c'est pareil pour une requête SQL simple, c'est pas logique que ça dure aussi longtemp !!!! Je souligne aussi que plus la table est longue (en nombre d'enregistrements) plus le temps d'exécution augmente.
0
PhP Messages postés 1774 Statut Membre 606
 
Bsr Alicia

Ta table Paradox est-elle indexée sur ce fameux champ DATE ?

Si ce n'est pas le cas ajoute un index à ta table avec ce champ et retestes mais plutôt en SQL ou alors indique explicitiment à Delphi d'utiliser ce nouvel index avant d'appliquer ton filtre car je suis pas sûr qu'il optimise les filtres. (J'aime pas les filtres ;-( )

Perso j'utilise des tables via ODBC (tables qui n'en sont pas en fait peu importe ) qui font plus de 50000 enregistrements et ca me prend au maximum quelques secondes lorsque j'utilise un index bien sûr (dans le cas contraire Delphi s'infuse les 50 000 lignes et là ca rame ...) sur PIII 1GHz 1Go RAM

PhP    [Push the button,Don't push the
.         button,Trip the station,Change the channel]
0
Utilisateur anonyme
 
Salut,

Remarques :

1- nous n'imprimons jamais les composants (les objets).. ! mais, plutôt nous imprimons les données ou les informations qu'ils contiennent.

2- un object est dit polymorphe lorsqu'on lui distingue plusieurs formes, soit et simplement, des composants de la même famille mais pour de différentes utilisations.

Exemple :

- Voir l'Edit, le MaskEdit et le DBEdit,.. ils se ressemblent mais ils sont destinés à des fins et pour des différentes utilisations.

Synthèse : (récapitulons)

- Donc sur une forme t'utilises un DBGRID, mais sur celle du QuickReport t'utilise les bandes dites Bands (voir dans l'inspecteur d'objet la propriété du QuickRep, Bands),

Pour la réponse :

- Activer :

[+] HasTitle (True) : pour les titre d'en-tête (statique) imprimer seulement sur la première page.

[+] HasDetail (True) : représente une seule occurrence (enregistrement) de la Table qu'affiche le DBGrid sur l'autre forme (c'est ici que réside la réponse pour ton problème..) cette bande se développe automatiquement et selon le nombre d'enregistrements que contient la Table/ Query..(la source de donnée).

[+] HasSummary (True) : récapitule les totaux, les sommes, les comptes et les moyennes, elle serait imprimée à la fin.

L'Héritage :

- Une Form est un père, (Parent)
- Un Quickrep est son enfant
- Une Band est l'enfant du Quickrep

? mais.. Band est parente de qui ?

- elle est parente des composants comme le QRDBText qui posséde deux propriétés d'indispensables :

Dataset : la source de donnée (expl : Table1/ Query1…)
DataField : le champs que tu veux afficher.

* A la fin, un petit conseil,

surtout, il faut bien chercher, essayer de te débrouiller et trouver la solution toi-même, et si ça te dépasse ici les gens sont très sympas,

te souhaitons bonne chance :)-

[ Ton Doux Visage. ]
0
Utilisateur anonyme
 
Desole Amou, on ne peut pas deplacer d'un post a l'autre...
. .
\_/
0
Utilisateur anonyme
 
Ok Obeet, donc c'est le concerné qui va se déplacer (la relativité)... :-)

[ Ton Doux Visage. ]
0
alicia_3107 Messages postés 4558 Statut Membre 6
 
En fait, je me suis complètement trompée, ce n'était pas un pb de filtre, il s'agit de la propriété RecordCount de TTable aprés un filtre, c'est elle qui prend du temps ... :(

RecordCount est supposée donner le nombre d'enregistrements ...
0
Utilisateur anonyme
 
salut Alichia :-)

Procedure onclickButtom1(Sender : TSender);
Var N : Integer;
Begin

...

Table1.Last; { atteindre le dernier enregistrement }
N := Table1.RecNo; { le numéro d'enregistrement actif }

...
End;

Notes :

- si tu constate que le chiffre est énorme (>>2^16) passer N à un LongInt = 2^32

- si tu utilises un query changer seuelement Table par Query.

Good luck..:-)

[ Ton Doux Visage. ]
0
alicia_3107 Messages postés 4558 Statut Membre 6
 
Ben non ! Aprés un filtre le RecNo du dernier record n'est pas forcément le nombre d'enregistrements :)
0