Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 22/11/2010, 13h43   #1
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

Informations professionnelles :
Activité : Architecte de système d'information

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
Par défaut Problème de "produit cartésien"

Aloha
Bon il ne s'agit pas exactement d'un produit cartésien.
Je construis une requête qui me permettra de lister un ensemble d'objet géométrique recouvrant à 80% un autre objet de la même table. Mais comme je calcule le taux de recouvrement à partir de la géométrie de l'intersection, j'ai deux fois le résultat dans mon select (une fois avec ID=1,ID=2 et une fois avec ID=2,ID=1).
Ma requête :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT                                                          /*+ ordered */
      E.GID,
       E."nom" AS NOM_EMPRISE,
       E."compleme",
       E."code_arc",
       E."commune",
       E2.GID,
       E2."nom" AS NOM_EMPRISE,
       E2."compleme",
       E2."code_arc",
       E2."commune"
  FROM E_EMPCTR E, E_EMPCTR E2
 WHERE     SDO_ANYINTERACT (E2.GEOMETRY, E.GEOMETRY) = 'TRUE'
       AND SDO_GEOM.
           SDO_AREA (SDO_GEOM.SDO_INTERSECTION (E.GEOMETRY, E2.GEOMETRY, 1),
                     1) >= 60 * SDO_GEOM.SDO_AREA (E.GEOMETRY, 1) / 100
       AND E.GID != E2.GID;
pour l'instant j'ai donc comme résultat :

Citation:
E.GID E.NOM_EMPRISE E1.GID E1.NOM_EMPRISE
----------------------------------------------------------------------------------------
2460 .ALLEE DES CHAMPENOIS.PROGRAMME 2009. 2056 .ALLEE DES CHAMPENOIS.
2056 .ALLEE DES CHAMPENOIS. 2460 .ALLEE DES CHAMPENOIS.PROGRAMME 2009.
....
Comment faire pour n'obtenir qu'une ligne puisqu'il s'agit de paire unique ?

D'avance, merci,

PS. Quelqu'un sait comment mettre en forme des tableaux dans les messages que l'on poste sur le forum ?
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 14h01   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Tu peux probablement t'en sortir la fonction analytique RANK OVER() sinon FIRST
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 16h03   #3
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

Informations professionnelles :
Activité : Architecte de système d'information

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
Merci orafrance.
Mais je ne saisis pas en quoi ces expressions vont me permettre de purger mon résultat des couples en double ({A,B} et {B,A}).
J'ai essayé le rank over, mais cela ne me renvoie pas la même valeur pour la ligne {A,B} et {B,A}.
Quant au first, il semble être utilisable avec une fonction d'aggregat, que je n'utilise pas (puisque ce n'est pas une moyenne ou un min d'un des id que je souhaite récupérer).
Ai-je mal compris quelque chose ?
D'avance, merci,
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 16h53   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 680
Points : 10 470
Points : 10 470
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Changez votre critère :
En :
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 29/11/2010, 10h17   #5
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

Informations professionnelles :
Activité : Architecte de système d'information

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
Aloha,

Bon je m'en suis sorti autrement, en organisant les emprises selon leur aire et en ne renvoyant de résultat que pour l'emprise ayant la plus grande dans le couple.

Maintenant je m'intéresse à d'autres objets toujours en relation avec des emprises (des polygones, des surfaces). Il s'agit de tronçons. Et si ma requête est correcte, je m'étonne de ne pas avoir de résultat au bout d'une heure de traitement.

Quelqu'un a-t-il une idée ?

D'avance, merci,

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
SELECT                                                             /*ORDERED*/
      S.GID,
       S.ID_EMPRISE,
       S.NOM_EMPRISE,
       S.LG,
       S.MAX_LG,
       R_VOIE.CODCOM,
       R_VOIE.CODRUE
  FROM    (   (SELECT T.GID,
                      E.GID AS ID_EMPRISE,
                      E."nom" AS NOM_EMPRISE,
                      E."commune" AS COMMUNE_EMPRISE,
                      SDO_GEOM.
                      SDO_LENGTH (
                         SDO_GEOM.
                         SDO_INTERSECTION (E.GEOMETRY, T.GEOMETRY, 0.1),
                         0.1)
                         AS LG,
                      MAX (
                         SDO_GEOM.
                         SDO_LENGTH (
                            SDO_GEOM.
                            SDO_INTERSECTION (E.GEOMETRY, T.GEOMETRY, 0.1),
                            0.1))
                      OVER (PARTITION BY E.GID)
                         AS MAX_LG
                 FROM E_EMPCTR E, R_TRONCO T
                WHERE SDO_ANYINTERACT (E.GEOMETRY, T.GEOMETRY) = 'TRUE'
                      AND SDO_RELATE (
                             E.Geometry,
                             T.Geometry,
                             'mask=covers+OVERLAPBDYDISJOINT+CONTAINS') =
                             'TRUE'-- AND E.GID = 1239
              ) S
           INNER JOIN
              R_TRONCO_RELATION
           ON S.GID = R_TRONCO_RELATION.GID_D)
       INNER JOIN
          R_VOIE
       ON (    R_TRONCO_RELATION.GID_A = R_VOIE.GID
           AND R_TRONCO_RELATION.CLASS = 'R_VOIE'
           AND R_TRONCO_RELATION."NAME" = 'referent')
 WHERE LG = MAX_LG
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 08h54   #6
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Pour tout ce qui est performance de requête, on ne peut rien dire si tu ne fournis pas beaucoup plus de renseignements, à savoir:

- La volumétrie (en gros) des tables concernées
- La volumétrie des résultats attendus
- Si la 2ième est toute petite par rapport à la première, alors le ou les critères qui seront les plus discriminants
- les index
et surtout: Le plan d'exécution!
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h09   #7
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

Informations professionnelles :
Activité : Architecte de système d'information

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
Aloha
La table E_EMPCTR fait 2600 lignes, la table R_TRONCO, 7000, la table R_VOIE, 3000. Tout ça à la louche. J'aimerai un résultat par ligne de E_EMPCTR où le code rivoli est nul, donc en gros 1200 lignes.
Les index spatiaux ont été reconstruits. Y a-t-il d'autres index qu'il me faudrait reconstruire ?
Ci dessous une capture d'écran du plan d'exécution.
Je ne vois toujours pas ce qui pêche...
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h16   #8
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et sans le hint ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h18   #9
Nouveau Membre du Club
 
Avatar de H.ile
 
Architecte de système d'information
Inscription : janvier 2008
Messages : 107
Détails du profil
Informations personnelles :
Âge : 32
Localisation : Macao

Informations professionnelles :
Activité : Architecte de système d'information

Informations forums :
Inscription : janvier 2008
Messages : 107
Points : 37
Points : 37
Citation:
Envoyé par orafrance Voir le message
et sans le hint ?
gné ?
sans le "/*ORDERED*/" ?
Bah c'est exactement le même plan d'exécution...
H.ile est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 11h06   #10
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 680
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 680
Points : 10 470
Points : 10 470
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Tel qu'il est écrit, c'est juste un commentaire, pas un HINT.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 12h27   #11
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Bon, la bonne nouvelle, c'est que l'optimiseur a bien détecté que ça allait être très coûteux, il ne reste plus qu'à remettre les bon index et les bonnes jointure pour que ça arrête de faire des acces-full de partout!
remi4444 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 15h35   #12
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par Waldar Voir le message
Tel qu'il est écrit, c'est juste un commentaire, pas un HINT.
En effet, au temps pour moi
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 16h56   #13
Membre Expert
 
Inscription : avril 2006
Messages : 1 024
Détails du profil
Informations forums :
Inscription : avril 2006
Messages : 1 024
Points : 1 175
Points : 1 175
Sinon, on vois que le domain-index a un coût assez faramineux! je pense qu'il faut voir de ce coté là, mais tu dois être plus spécialiste que nous sur ce point précis....
remi4444 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 04h10.


 
 
 
 
Partenaires

Hébergement Web