AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Index wird teilweise nicht benutzt
Thema durchsuchen
Ansicht
Themen-Optionen

Index wird teilweise nicht benutzt

Ein Thema von Dumpfbacke · begonnen am 10. Aug 2016 · letzter Beitrag vom 11. Aug 2016
Antwort Antwort
Bambini
(Gast)

n/a Beiträge
 
#1

AW: Index wird teilweise nicht benutzt

  Alt 10. Aug 2016, 13:46
Nur warum wird denn den Index des Feldes 5 benutzt ?
Die Optimizer der DB Systeme haben da so ihre Geheimnisse
Wie sieht des der Execution Plan für dieses Statement aus?
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
335 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: Index wird teilweise nicht benutzt

  Alt 10. Aug 2016, 14:44
Nur warum wird denn den Index des Feldes 5 benutzt ?
Die Optimizer der DB Systeme haben da so ihre Geheimnisse
Wie sieht des der Execution Plan für dieses Statement aus?

Plan
PLAN SORT (JOIN (Tabelle1 INDEX (IDX_FELD1), Tabelle2 INDEX (IDX_FELD9, IDX_FELD9)))

------ Performance info ------
Prepare time = 639ms
Execute time = 1m 13s 539ms
Avg fetch time = 4.085,50 ms
Current memory = 14.478.580
Max memory = 14.634.260
Memory buffers = 800
Reads from disk to cache = 52.880
Writes from cache to disk = 0


Wenn ich die erste Bedingung entferne

Plan
PLAN SORT (JOIN (Tabelle1 INDEX (IDX_Feld4, IDX_Feld4, IDX_Feld4, IDX_Feld4, IDX_Feld4, IDX_Feld5), Tabelle2 INDEX (IDX_Feld9, IDX_Feld9)))

------ Performance info ------
Prepare time = 655ms
Execute time = 3s 291ms
Avg fetch time = 253,15 ms
Current memory = 17.677.420
Max memory = 17.696.404
Memory buffers = 800
Reads from disk to cache = 30.649
Writes from cache to disk = 0

Hier benutze er jeodch auch nicht den Index des Feld2 und Feld 3 was jedoch nicht so tragisch ist da es trotzdem schnell geht.

Warum benutzt er immer nur einen Teil ?
Tanja
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#3

AW: Index wird teilweise nicht benutzt

  Alt 10. Aug 2016, 15:26
Hier benutze er jeodch auch nicht den Index des Feld2 und Feld 3 was jedoch nicht so tragisch ist da es trotzdem schnell geht.
Evtl. spricht die Statistik dagegen diese Indices auch noch zu lesen. Evtl. sind sehr viel gleiche Werte in der Tabelle/Index und dann geht er den Weg die Werte für Feld2 und Feld3 direkt aus der Treffermenge der anderen Indices zu prüfen.
Warum benutzt er immer nur einen Teil ?
Wenn immer die gleichen Felder abgefragt werden, würde ich versuchen einen zusammengesetzten Index über alle betroffenen Felder zu bauen und nicht für jedes Feld einen eigenen. Die Felder aber nur dann in den Index mit aufnehmen, wenn genügend verschiedene Werte in diesem Feld erwartet werden.
  Mit Zitat antworten Zitat
Dumpfbacke

Registriert seit: 10. Mär 2005
Ort: Mitten in Deutschland
335 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: Index wird teilweise nicht benutzt

  Alt 11. Aug 2016, 06:52
Wenn immer die gleichen Felder abgefragt werden, würde ich versuchen einen zusammengesetzten Index über alle betroffenen Felder zu bauen und nicht für jedes Feld einen eigenen. Die Felder aber nur dann in den Index mit aufnehmen, wenn genügend verschiedene Werte in diesem Feld erwartet werden.
Ich habe nun mal einen Index über alle Felder angelegt. Leider benutz er diesen Index nicht. Es benutzt den Index des ersten Feldes. Wenn ich das erset Feld rausnehme bei der Where benutzt er die Index.
Ich verstehe langsam nicht mehr was das Teil da machet ????

Tanja
Tanja
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Index wird teilweise nicht benutzt

  Alt 11. Aug 2016, 08:24
Das kannst Du auch nicht "verstehen", der Optimizeralgorithmus basiert auf (hoffentlich) komplexen Entscheidungen, den Statistiken* und irgendwelchen genialen oder doofen Ideen der Entwickler.
Das bedeutet konkret, die Änderung eines einzigen (!) Feldinhaltes kann den Optimizer dazu bringen, einen anderen Ausführungsplan zu verwenden.

Dein "großer" Index muss demzufolge nicht alle Felder enthalten, nur die wichtigsten. Kleinkram geht auch ohne Index. Es sollte - wie schon oben gesagt- Felder mit hoher Varianz, wenig/kein NULL sein.

*Statistiken: Mengenverhältnisse der Werte in den Feldern der Tabellen.
Gruß, Jo
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#6

AW: Index wird teilweise nicht benutzt

  Alt 11. Aug 2016, 08:44
Nachtrag
Die beiden Ausführungspläne zeigen jedenfalls, dass der 2. Plan viel besser ist.
Also wie kann man den Optimizer dazu bringen, dem 2. Plan zu folgen ohne die Bedingung wegzulssen?

Den (Ausführungs)Plan angeben
http://www.firebirdfaq.org/faq224/

Unbehilfliche Indizes löschen (Feld1)

oder wenn der Index an anderer Stelle gebraucht wird, die Abfrage so formulieren, dass der Index nicht greifen kann:
http://www.firebirdfaq.org/faq158/

Außerdem:
Warum verwendest Du "Group by", ohne eine Aggregatfunktion?
Falls es um die Unterdrückung doppelter Ergebnisssätze geht, überprüfe Dein Join Kriterium.
Wenn eine Bedingung fehlt, kann es zu Permutationen führen, die mehrfachen Datensätze wären ein Indiz dafür.
Das zieht natürlich auch die Performance runter und "verwirrt" ggF. den Optimizer.
Gruß, Jo
  Mit Zitat antworten Zitat
Bambini
(Gast)

n/a Beiträge
 
#7

AW: Index wird teilweise nicht benutzt

  Alt 11. Aug 2016, 08:47
Ich habe nun mal einen Index über alle Felder angelegt. Leider benutz er diesen Index nicht. Es benutzt den Index des ersten Feldes. Wenn ich das erset Feld rausnehme bei der Where benutzt er die Index.
Ich verstehe langsam nicht mehr was das Teil da machet ????
Die Einzelfeld Indices würde ich löschen. Anhand deines Statements würde ich den Index mit diesen Felder bestücken:
Code:
Tabelle 1:
Feld2,Feld3,Feld4

Tabelle2:
die JOIN Felder und das Feld9
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz