Announcement

Collapse
No announcement yet.

Optimizer kommt mit Parametern nicht klar?

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

  • Optimizer kommt mit Parametern nicht klar?

    Hallo,

    ich bin sicher nur blockiert.
    Beim Optimieren einer Abfrage komme ich nicht weiter.
    Ich benutze IBExpert und führe eine einfache Abfrage aus:
    Code:
    select * from adresse where name1 like 'Ausbau%'
    Index auf Name1 ist gesetzt.
    Gefunden werden 13 Datensätze, die Geschwindigkeitsanalyse zeigt mir auch 13 indizierte Reads.

    Jetzt ändere ich die Abfrage:
    Code:
    select * from adresse where name1 like :name1
    und gebe im Parameter Dialog als Wert 'Ausbau%' ein.

    Jetzt zeigt mir die Geschwindigkeisanalyse 52732 nicht indizierte Reads.
    Es dauert auch tatsächlich länger.

    Das ist das Verhalten bei FB 1.52.

    Wenn ich das gleiche mit FB 2.1 mache, ist das verhalten ähnlich. Nur zeigt IBExpert die Reads als indizierte Reads an.

    Ich bin davon ausgegangen, das die Abfrage doch die gleiche ist.

    Das Lustige daran ist, dass eine Umstellung auf between wieder schlell ist:
    Code:
    select * from adresse where name1 between :name1 and :name2
    Für name1 gebe ich 'Ausbau' und für name2 'Ausbauzzzzzzzzzzzzzzzzz' an.
    Jetzt sind es wieder 13 indizierte Reads.

    Ich habe in IBExpert die richtigen fbclient.dll' s eingetragen.

    Kann mir jetzt jemand auf die Sprüge helfen, wieso das Verhalten ohne Parameter so anders ist?

    Danke, Frank
    Zuletzt editiert von Frank Reim; 09.01.2008, 21:12.

  • #2
    % ist eine Wildcard in SQL. Deshalb sind Name1 und Name2 das Selbe

    Comment


    • #3
      Originally posted by Markus Kinzler View Post
      % ist eine Wildcard in SQL. Deshalb sind Name1 und Name2 das Selbe
      Hätte mich gewundert, wenn du nicht der erste bist, der antwortet.
      Das hilft mir aber nicht wirklich weiter. Ich weiß, was das % bedeudet, dafür benötige ich keine Erklärung.
      Ich suche eine Antwort, warum das Verhalten bei Verwendung von Parametern in der Query anders ist.

      Frank

      Comment


      • #4
        Hallo Frank,

        Du mußt bei parametrisierten Abfragen mit LIKE bzgl. Performance immer berücksichtigen, dass Firebird ja zu Prepare-Zeit, wo letztendlich auch der Zugriffsplan erstellt wird, noch keine Ahnung darüber hat, welche Parameterwerte daherkommen. Somit kann Firebird ein LIKE auch nicht dahingehend optimieren, dass ein Index verwendet wird, weil der Parameterwert könnte ja auch '%Wert%' sein!

        Anders sieht es allerdings aus, wenn Firebird bei einem LIKE bereits zur Prepare-Time weiß, um welchen Wert es sich handelt. So kann dann ein Index verwendet werden, abhängig davon, wie im Wert die Wildcards verwendet werden.

        Hoffe das hilft.

        Thomas
        Thomas Steinmaurer

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

        Comment


        • #5
          Hallo Thomas,

          ich danke dir für die klare Antwort. Es leuchtet mir mit deiner Erläuterung auch ein, war mir aber ehrlich gesagt bis jetzt nicht bewusst (*schäm*).
          Da ich IBO benutze und JW ja einen Filter in Where SQL parst, habe ich jetzt im speziellen Fall auf Filter umgestellt. Das haut erst mal hin.
          Na ja, so muss ich halt meinen DataController umstellen und einige Abfragen ändern.

          Das gute daran ist, dass ich jetzt eine neue Version mit doch erheblich verbessertem Zeitverhalten liefern kann

          Frank

          Comment

          Working...
          X