Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

construction requette

5 réponses
Avatar
Olivier B.
Salut,
Pour referencer des fichiers sur différents stockages j'ai une table
objets qui contient la descriction d'objets, une table instance qui
contient les existances de ces objets dans un nombre de localisation
variables referencée dans une table loc, exemple simplifié

obj.id obj.nom
1 fichier1
2 fichier2


inst.objid inst.loc
1 1
2 1
1 4



donc fichier1 est dans les loc 1 et 4, fichier2 est dans la loc2, la
loc 3 a été supprimée.

J'ai un etat qui référence les fichiers selon leur localisation:


loc1 loc4
fichier1 X X
fichier2 X


Pour faire cela je requette la table objets puis pour chaque
enregistrement je requette la table instance pour recuperer les
engeristrement sous inst.objid = id de l'objet courant, cela
fonctionne tres bien pour un petit nombre de resultats mais on me
demande de pouvoir générer un etat total, et la le temps d'execution
passe à plusieurs minutes, j'ai environ 30000 objets, 9 localisation
et 70000 instances...

J'utilise MSSQL 2K5 et ASP pour générer l'état, je cherche à savoir
s'il est possible de n'ecrire une seule requette qui me sorte
directement l'état.

merci

--
pas de turlututu. apres l'@robase

5 réponses

Avatar
Fred BROUARD
Bonjour,

commencez par nous donner le nom des tables et le nombre exact et
maximum des localisation et les détaillants un à un.

Enfin, un telle requête n'est pas à faire sur le serveur SQL en général
mais plutôt du côté client, car ce que vous voulez, c'est de la cosmétique !
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9

A +




Olivier B. a écrit :
Salut,
Pour referencer des fichiers sur différents stockages j'ai une table
objets qui contient la descriction d'objets, une table instance qui
contient les existances de ces objets dans un nombre de localisation
variables referencée dans une table loc, exemple simplifié

obj.id obj.nom
1 fichier1
2 fichier2


inst.objid inst.loc
1 1
2 1
1 4



donc fichier1 est dans les loc 1 et 4, fichier2 est dans la loc2, la
loc 3 a été supprimée.

J'ai un etat qui référence les fichiers selon leur localisation:


loc1 loc4
fichier1 X X
fichier2 X


Pour faire cela je requette la table objets puis pour chaque
enregistrement je requette la table instance pour recuperer les
engeristrement sous inst.objid = id de l'objet courant, cela
fonctionne tres bien pour un petit nombre de resultats mais on me
demande de pouvoir générer un etat total, et la le temps d'execution
passe à plusieurs minutes, j'ai environ 30000 objets, 9 localisation
et 70000 instances...

J'utilise MSSQL 2K5 et ASP pour générer l'état, je cherche à savoir
s'il est possible de n'ecrire une seule requette qui me sorte
directement l'état.

merci





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Avatar
Fred BROUARD
Bonjour,

commencez par nous donner le nom des tables et le nombre exact et
maximum des localisation et les détaillants un à un.

Enfin, un telle requête n'est pas à faire sur le serveur SQL en général
mais plutôt du côté client, car ce que vous voulez, c'est de la cosmétique !
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9

A +




Olivier B. a écrit :
Salut,
Pour referencer des fichiers sur différents stockages j'ai une table
objets qui contient la descriction d'objets, une table instance qui
contient les existances de ces objets dans un nombre de localisation
variables referencée dans une table loc, exemple simplifié

obj.id obj.nom
1 fichier1
2 fichier2


inst.objid inst.loc
1 1
2 1
1 4



donc fichier1 est dans les loc 1 et 4, fichier2 est dans la loc2, la
loc 3 a été supprimée.

J'ai un etat qui référence les fichiers selon leur localisation:


loc1 loc4
fichier1 X X
fichier2 X


Pour faire cela je requette la table objets puis pour chaque
enregistrement je requette la table instance pour recuperer les
engeristrement sous inst.objid = id de l'objet courant, cela
fonctionne tres bien pour un petit nombre de resultats mais on me
demande de pouvoir générer un etat total, et la le temps d'execution
passe à plusieurs minutes, j'ai environ 30000 objets, 9 localisation
et 70000 instances...

J'utilise MSSQL 2K5 et ASP pour générer l'état, je cherche à savoir
s'il est possible de n'ecrire une seule requette qui me sorte
directement l'état.

merci





--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
Enseignant aux Arts & Métiers PACA et à L'ISEN Toulon - Var Technologies
*********************** http://www.sqlspot.com *************************
Avatar
Olivier B.
On Sat, 21 Nov 2009 17:43:42 +0100, Fred BROUARD
wrote:

Olivier B. a écrit :
Salut,
Pour referencer des fichiers sur différents stockages j'ai une table
objets qui contient la descriction d'objets, une table instance qui
contient les existances de ces objets dans un nombre de localisation
variables referencée dans une table loc, exemple simplifié

obj.id obj.nom
1 fichier1
2 fichier2


inst.objid inst.loc
1 1
2 1
1 4

donc fichier1 est dans les loc 1 et 4, fichier2 est dans la loc2, la
loc 3 a été supprimée.

J'ai un etat qui référence les fichiers selon leur localisation:


loc1 loc4
fichier1 X X
fichier2 X


Pour faire cela je requette la table objets puis pour chaque
enregistrement je requette la table instance pour recuperer les
engeristrement sous inst.objid = id de l'objet courant, cela
fonctionne tres bien pour un petit nombre de resultats mais on me
demande de pouvoir générer un etat total, et la le temps d'execution
passe à plusieurs minutes, j'ai environ 30000 objets, 9 localisation
et 70000 instances...

J'utilise MSSQL 2K5 et ASP pour générer l'état, je cherche à savoir
s'il est possible de n'ecrire une seule requette qui me sorte
directement l'état.





Bonjour,

commencez par nous donner le nom des tables



table objet = obj
table instance = inst
table localisation = locs

et le nombre exact et
maximum des localisation



à cet instant 9 locs, mais cela varie au gres du renouvellement des
espaces de stockage et evolution de l'espace de production, quand au
maximum il pourrait atteindre une cinquantaine environ, voici quelque
chose de plus précis:

Table objets, nom obj

obj.id obj.nom
1 fichier1
2 fichier2
...
30000 fichier30000




Table instance, nom inst

inst.id inst.objid inst.locid
1 1 1
2 2 1
...
70000 1 4




Table localisations, nom locs

locs.id locs.nom
1 satanas011
2 satanas014
3 satanas034
...
9 satanas056



une ligne de la table instance représente l'existance d'un fichier
dont:
- l'id liant à l'objet est stocké dans le champs inst.objid
- l'id liant à la localisation est stocké dans le champs inst.locid

et les détaillants un à un.



quel detail voulez vous ? dans l'exemple cité les locs sont des
espaces de stockage ftp, genre machine pleine de disques

Enfin, un telle requête n'est pas à faire sur le serveur SQL en général
mais plutôt du côté client, car ce que vous voulez, c'est de la cosmétique !
Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9



Si je comprend bien le "client" serait ici le serveur web sur lequel
il me faudrait présenter les donnés avant de les envoyer au
navigateur?

Actuellement c'est déjà ce que je fais, le resultat est que je génère
autant de requettes sur la table inst que j'ai de ligne dans la table
obj afin de construire le tableau ligne par ligne, plus precisement ce
que je fais:


SELECT * FROM locs

création de la premiee ligne du tableau html avec les noms en clair
des locs, mémorisation dans une varaiable tableau des id_locs
correspondant à chaque colones.

SELECT * FROM obj

<boucle ligne obj>

SELECT * FROM inst WHERE inst.objid=<id de l'objet courant>

traitement de creation de ta ligne de presence de
l'objet courant en fonction des lignes d'instance reournée
et de la correspondance avec les id_loc memorisés, s'il y a
correspondance dans le rang du tableau html je noircis
la case

</boucle ligne obj>


(J'ai mis * pour simplifier, en realité je ne prend que les champs
nécéssaires)

J'ai bien compris l'aspect "cosmetique" de ce que je demande ne plait
pas, mais si c'est la solution à mon probleme de perf je prend, je
precise qu'il y a peu de consultations donc je peux accepter une
charge BDD elevée si cela reduit le temps de traitement...

en prospectant un peu je vois que l'operateur pivot ressembe à ce que
je veux faire, je gratte je gratte mais aucun bon résultat pour le
moment

merci

--
pas de turlututu. apres l'@robase
Avatar
Olivier B.
Salut,
comment dois-je interpréter ce silence, on ne peut resoudre la
presentation des donnés en une seule requette ou j'ai mal exprimé les
donnés du probleme ?
merci

--
pas de turlututu. apres l'@robase
Avatar
Patrice
Bonjour,

C'est donc une page HTML ? Si pas déjà fait je vérifierai déjà ce qui prend
du temps. Si le résultat est par exemple rendu sous forme d'un tableau de
30000 lignes et 9 colonnes, il est possible que le temps de transmission de
la page et le temps de rendu du tableau par le navigateur ne soit pas
négligeable.

Sinon, le tableau est bien dimensionné une fois pour toute et l'accès à
chaque ligne, colonne bien optimisé ? Une optimisation que je vois est la
boucle sur obj qui me semble inutile (on prend toutes les lignes en triant
sur le objid et le locid donne la case de tableau, ce qui permettrait
d'avoir une requête unique au lieu de 30000 requêtes qui ne retourneront que
qq lignes ?!). J'ai déjà fait une fois qq chose de semblable et qui semblait
bien marcher avec il est vrai bien moins de données ;-)

Sinon j'utilise maintenant généralement l'outil de reporting pour faire cela
(par exemple SQL Server Reporting Services et son "matrix" ou "tablix" qui
permet de générer des tableaux croisés) ce qui explique mon peu de
familiarité avec le pivot (à vérifier mais je crois que les colonnes doivent
être connues à l'avance donc il faudra que l'application génère la phrase
SQL).

Bonne continuation...

--
Patrice


"Olivier B." a écrit dans le message de
groupe de discussion :
Salut,
comment dois-je interpréter ce silence, on ne peut resoudre la
presentation des donnés en une seule requette ou j'ai mal exprimé les
donnés du probleme ?
merci

--
pas de turlututu. apres l'@robase