Announcement

Collapse
No announcement yet.

Abfrage dauert übermäßig lang!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Abfrage dauert übermäßig lang!

    Ich habe eine Abfrage in SQLite die 27s braucht.
    Nun wollte ich diese Abfrage in Firebird ausführen und habe nach 45min. den FB-Server abgeschossen (mit dem Taskmanager)!

    Vorab mal eine kurze Info.
    • Tabelle way_nodes besitzt 745815 Datensätze (Zeilen)
    • Tabelle tv_highway besitzt 46416 DS
    • Tabelle node besitzt 652866 DS
    • entsprechende Index / Indizes wurden gesetzt
    • DB für SQLite und Firebird sind vom Inhalt her identisch


    Die Abfrage ergibt in SQLite...
    376053 Zeilen abgeholt (6,77 sec)

    In SQLite sieht die Abfrage wie folgt aus...
    Code:
    SELECT * FROM node WHERE nodeID IN
    (
    SELECT nodeID FROM way_nodes INNER JOIN tv_highway WHERE way_nodes.wayID = tv_highway.wayID
    )
    In Firebird musste ich diese etwas abändern und sieht so aus...
    Code:
    SELECT * FROM node WHERE nodeID IN
    (
    SELECT
      WAY_NODES.NODEID 
    FROM
     WAY_NODES
     INNER JOIN TV_HIGHWAY ON (WAY_NODES.WAYID=TV_HIGHWAY.WAYID)
    )
    Die Abfrage in FB funktioniert, da ich mal die Ergebnismenge in der Subquery auf 10 begrenzt habe und es dafür das richtige Ergebnis zurück geliefert wurde.

    Ich brauche eine Idee, was ich da noch machen kann, außer auf Firebird zu verzichten.
    Zuletzt editiert von Mighty Panther; 06.11.2008, 15:44.

  • #2
    Hallo,

    welche Indizes existieren und welcher PLAN (Zugriffsplan) wird für dein Statement generiert?

    Was kommt bei diesem Statement raus?

    [highlight=sql]
    SELECT * FROM node n WHERE
    exists (select 1 from way_nodes wn inner join tv_highway th on (wn.wayid = th.wayid) where wn.nodeid = n.nodeid)
    [/highlight]


    Thomas
    Thomas Steinmaurer

    Firebird Foundation Committee Member
    Upscene Productions - Database Tools for Developers
    Mein Blog

    Comment


    • #3
      @Thomas Steinmaurer: Danke für deine Antwort, aber die Ausführung der Abfrage dauert leider auch zu lang bzw. habe ich es nach ein paar Minuten abgebrochen.

      Ich habe es jetzt (mehr oder weniger durch probieren) anders gelöst.
      Die Abfrage sieht jetzt so aus und bringt das selbe Ergebnis wie die andere Abfrage in SQLite.

      Code:
      INSERT INTO TV_HIGHWAY_NODE SELECT DISTINCT NODE.* FROM WAY_NODES
      INNER JOIN NODE ON (WAY_NODES.NODEID=NODE.NODEID) 
      INNER JOIN TV_HIGHWAY ON (WAY_NODES.WAYID=TV_HIGHWAY.WAYID)
      LG
      Mighty

      Comment


      • #4
        Hi,

        warum verwendest Du IN bzw. EXISTS? Mach doch einfach einen weiteren JOIN:
        Code:
        SELECT
          node.*
        FROM
         WAY_NODES
         INNER JOIN TV_HIGHWAY ON (WAY_NODES.WAYID=TV_HIGHWAY.WAYID)
         INNER JOIN NODE ON (NODE.nodeid=WAY_NODES.NODEID);
        Dim
        Zitat Tom Kyte:
        I have a simple philosophy when it comes to the Oracle Database: you can treat it as a black box and just stick data into it, or you can understand how it works and exploit it as a powerful computing environment.

        Comment


        • #5
          Welche Firebird-Version verwendest Du?
          Zum Thema IN und EXISTS solltest Du Dir das hier auf jeden Fall mal ansehen: http://www.firebirdfaq.org/faq37/

          Comment

          Working...
          X