none
Fehlerhafte Optimierung RRS feed

  • Frage

  • Hallo,

    bei einer bestehenden View möchte ich einige Zeilen ausblenden. Dabei schlägt der Optimierer zu und die Abfrage wird deutlich langsamer.

    Die Ausführung der Original-View dauert 3 sec und liefert 2500 Datensätze. Von diesen Datensätz möchte ich einige ausblenden mit

    select * from OriginalView where (KST <> 2000) and (KST <> 2001)

    Diese Abfrage dauert dann 3,5 Minuten. Der Optimierer versucht die Kostenstelle KST schon an tieferer Stelle auszublenden.

    Wie kann ich den Optimierer bei diesem select abschalten.

    Lothar

    Donnerstag, 7. Juni 2018 11:29

Antworten

  • Habe ich ausprobiert, dauert genau so lange wie meine Originalabfrage.

    Danke für die schnelle Antwort.

    Lothar

    • Als Antwort markiert LotharRausch Donnerstag, 7. Juni 2018 14:39
    Donnerstag, 7. Juni 2018 14:39
  • Ich habe noch eine Lösung gefunden.

    Man kann den Optimierer durch eine Abfrage der Art

    select top 100000 * from OriginalView where (KST <> 2000) and (KST <> 2001)

    austricksen.

    • Als Antwort markiert LotharRausch Montag, 12. November 2018 15:24
    Montag, 12. November 2018 15:24

Alle Antworten

  • Gar nicht.

    Eine View erleichtert nur beim Tippen einer Abfrage. Im Endergebnis wird der SQL einer View in den ausführenden SQL eingebettet und dann im Zusammenhang optimiert.

    Eine Abfrage auf "<>" erzwingt häufig einen Tablescan wenn nicht weitere Felder in der where-Klausel verwendet werden, für die es dann einen Index gibt.

    Prüfe mal die Where-Klausel auf deiner View-Abfrage ob zu den anderen Feldern ein Index besteht.

    Donnerstag, 7. Juni 2018 11:52
  • Auch eine andere Formulierung könnte helfen:

    KST not in (2000, 2001)


    Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu

    Donnerstag, 7. Juni 2018 12:25
    Beantworter
  • Not in wird genauso behandelt wie obige And-Bedingung.
    U.U. baut der Optimizer einen "not in" sogar in "and var <> v1 and var <> v2 ..." um.
    Donnerstag, 7. Juni 2018 12:49
  • Habe ich ausprobiert, dauert genau so lange wie meine Originalabfrage.

    Danke für die schnelle Antwort.

    Lothar

    • Als Antwort markiert LotharRausch Donnerstag, 7. Juni 2018 14:39
    Donnerstag, 7. Juni 2018 14:39
  • Da wird sich auch nichts dran ändern, so lange du per Where-Klausel nicht weitere Einschränkungen vornimmst, dei dann optimierbar sind.

    Eine "<>"-Prüfung muss doch alles durchsuchen.

    Donnerstag, 7. Juni 2018 15:03
  • Hallo

    anstatt <> (ungleich) oder not in würde ich mal

    (Kst < 2000) or (KST > 2001)

    versuchen

    

    

    Freitag, 8. Juni 2018 11:30
  • Ich habe noch eine Lösung gefunden.

    Man kann den Optimierer durch eine Abfrage der Art

    select top 100000 * from OriginalView where (KST <> 2000) and (KST <> 2001)

    austricksen.

    • Als Antwort markiert LotharRausch Montag, 12. November 2018 15:24
    Montag, 12. November 2018 15:24