2011-01-11 12 views
0

Basisinformationen: Dies ist im Zusammenhang mit der Indizierung von OpenStreetMap-Daten. Um die Frage zu vereinfachen: Die Kerninformation ist in 3 Haupttypen mit dem Wert "W", "R", "N" (VARCHAR(1)) unterteilt.Indizierung/Performance-Strategien für große Menge des gleichen Werts

Die Tabelle hat irgendwo ~ 75M Reihen, alle Spalten mit "W" bilden ~ 42M Reihen. Vorhandene Indizes sind für diese Frage nicht relevant.


Jetzt die Frage selbst: Die Indizierung der Daten erfolgt über eine Prozedur. Innerhalb dieser Prozedur gibt es einige Schleifen, die Folgendes tun:

[...] SELECT * FROM Tabelle WHERE the_key = "W"; [...]

Die Ergebnisse werden erneut geloopt und die obige Abfrage befindet sich ebenfalls in einer Schleife. Dies kostet viel Zeit und verlangsamt den Prozess massiv. Ein Indexon the_key ist offensichtlich nutzlos, da alle Werte, die der Index verwenden könnte, dieselben sind ("W"). Das Skript selbst läuft mit einer Geschwindigkeit, die OK ist, nur die SELECT dauert sehr lange.

Muss ich

  • Notwendigkeit, einen „besonderen“ Art Index zu erstellen, die dies berücksichtigt und macht die SELECT schneller? Wenn ja, welcher?
  • müssen einige der Server-Parameter tunen (sie sind bereits abgestimmt und das Ergebnis, das sie liefern, scheinen gut zu sein. Wenn nötig, kann ich sie posten)?
  • müssen mit der Geschwindigkeit leben und einfach mehr Hardware bekommen, um mehr Leistung zu gewinnen (Tim Taylor grunt grunt)?

Irgendwelche Alternativen zu den oben genannten Punkten (außer es neu schreiben oder nicht verwenden)?

+0

Was können Sie noch optimieren? Es kann sein, dass die Langsamkeit von der schieren Menge an Daten stammt, die Sie verarbeiten. z.B. Tun Sie nicht SELECT * FROM Tabelle WHERE the_key = "W" in einer Schleife. – nos

Antwort

2

Diese Abfrage könnte einen Index verwenden, wenn Sie work_mem hoch genug setzen, um einen Bitmap-Index-Scan zu aktivieren. Es ist jedoch durchaus möglich, dass der Optimizer sie nicht verwendet. Insgesamt gibt es nicht viel zu optimieren. Es sieht so aus, als ob der umgebende Schleifencode verbesserungsbedürftig ist.

+0

+1. Wenn mehr als die Hälfte der Zeilen der Bedingung "the_key = 'W'" entsprechen, wird der Planer wahrscheinlich trotzdem einen Tabellenscan wählen, nicht wahr? Der Schlüssel besteht darin, ein mehrmaliges Durchlaufen dieses Resultsets zu vermeiden. –

1

Zuerst sagen:

Die Tabelle irgendwo hat ~ 75M Reihen, alle Spalten mit "W" Reihen ~ 42M bilden.

Dann sagen Sie, dass Sie

SELECT * FROM table WHERE the_key = "W"; 

mehrmals in einer Schleife zu tun und erwarten, dass es zu erfüllen? Es ist unmöglich - keine Indexierung würde diese Abfrage beschleunigen - es muss 42 Millionen Zeilen zurückgeben - mehr als die Hälfte. Wenn Sie sich weigern, dieses Indizierungsverfahren neu zu schreiben, um eine mehrmalige Abfrage zu vermeiden, dann ist es nur The Daily WTF wert.

+0

Ich verlange keine Magie oder so etwas. Vielleicht gibt es "versteckte Juwelen", die hätten helfen können, ich hoffe immer auf so etwas;). Ich wollte nur bestätigen, dass dies der Autor des Skripts ist. Anyway +1 für subtilen Sarkasmus ^^ – DrColossos

Verwandte Themen