PHP DB-Abfrage
Paul
- datenbank
Moin,
mit folgender Zeile frage ich eine MSSQL Datenbank ab:
$stmt = $vgs_pdo->prepare("SELECT NAME, RECHTS, HOCH FROM dbName WHERE RECHTS <= ? AND RECHTS >= ? AND HOCH <= ? AND HOCH >= ?");
Klappt auch. Nur will ich die gefundenen Datensätze wegen der Performance begrenzen.
Habe schon "SELECT top 10 NAME, ..." versucht. Dabei werden nur die ersten 10 Einträge geliefert. Allerdings werden immernoch alle 40.000 Einträge der DB durchsucht => keine Performanceverbesserung.
Wie kann ich es erreichen, dass die Abfrage nach 10 gefundenen Einträgen abbricht?
Paul
Moin,
mit folgender Zeile frage ich eine MSSQL Datenbank ab:
$stmt = $vgs_pdo->prepare("SELECT NAME, RECHTS, HOCH FROM dbName WHERE RECHTS <= ? AND RECHTS >= ? AND HOCH <= ? AND HOCH >= ?");Klappt auch. Nur will ich die gefundenen Datensätze wegen der Performance begrenzen.
Habe schon "SELECT top 10 NAME, ..." versucht. Dabei werden nur die ersten 10 Einträge geliefert. Allerdings werden immernoch alle 40.000 Einträge der DB durchsucht => keine Performanceverbesserung.
Wie kann ich es erreichen, dass die Abfrage nach 10 gefundenen Einträgen abbricht?
Paul
Hast dus schon mit LIMIT versucht??
lg Richie
Hello,
Hast dus schon mit LIMIT versucht??
da kann der MSSQL-Server IMHO nichts mit anfangen.
MfG
Rouven
Hello,
Wie kann ich es erreichen, dass die Abfrage nach 10 gefundenen Einträgen abbricht?
es mag noch jemanden mit mehr spezifischem MSSQL-Wissen geben (hallo Frank...), aber ich fürchte fast, wenn TOP das Problem NICHT löst, dann wird es ohne weiteres keine Lösung geben. Für jedes Statement mit ORDER BY lässt sich das Verhalten sogar sinnvoll begründen, für eines ohne ORDER BY allerdings nicht ohne weiteres...
MfG
Rouven
yo,
Habe schon "SELECT top 10 NAME, ..." versucht. Dabei werden nur die ersten 10 Einträge geliefert. Allerdings werden immernoch alle 40.000 Einträge der DB durchsucht => keine Performanceverbesserung.
halte ich für ein Gerücht, vielleicht durchsucht er 40.000 Datensätze, aber er wird nach den ersten 10 Treffer nicht weiter suchen. Es sei den, du hast us nicht die ganze Wahrheit gesagt, und es ist eine Sortierung mit drinne.
Schau dir mal den Ausführungsplan aus, ich vermute eine felende oder nicht rchtig gesetzte Indizierung.
Ilja
Stimmt, da steckt noch ne Sortierung mit drin (ORDER BY). Hab ich hier rausgelassen um das Statement klein zu halten (mein Fehler).
Wäre es nicht trotzdem sinnvoll die ersten 10 Treffer zu sortieren?
Paul
Auch ohne Sortierung keine Performance Verbesserung!
Paul
yo,
das kommt drauf an, wann die sortierunng ausgeführt wird. ob er erst sortiert und dann die ersten 10 holt, oder erst 10 holt und dann sortiert. ich halte es für sinnvoll, erst zu sortieren und dann die 10 ersten auszugeben, dann muss er natürlich über den ganzen bestand. das gleiche problem tritt bei GROUP BY auf.
Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut, sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ? auch sehe ich das ">" Zeichen als kritisch an.
Ilja
Hallo
Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut, sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ? auch sehe ich das ">" Zeichen als kritisch an.
diese könnten hier sinnvollerweise durch BETWEEN ... AND
ersetzt werden.
Schnelle Tests mit ca. 100.000 Datensätzen zeigten deutlich unterschiedliche
Laufzeiten von Abfragen mit und ohne TOP.
Freundliche Grüße
Vinzenz
diese könnten hier sinnvollerweise durch
BETWEEN ... AND
ersetzt werden.
Da wird bei mir gar nicht gefunden:
"SELECT TOP 10 NAME, RECHTS, HOCH FROM
dbName WHERE RECHTS BETWEEN ? AND ? AND HOCH BTWEEN ? AND ? ORDER BY NAME"
Oder bin ich zu doof?
Hallo
diese könnten hier sinnvollerweise durch
BETWEEN ... AND
ersetzt werden.Da wird bei mir gar nicht gefunden:
"SELECT TOP 10 NAME, RECHTS, HOCH FROM
dbName WHERE RECHTS BETWEEN ? AND ? AND HOCH BTWEEN ? AND ? ORDER BY NAME"
Oder bin ich zu doof?
wenn Du die Dokumentation zu BETWEEN ... AND nicht gelesen hast und daher die
Reihenfolge Deiner Parameter nicht geändert hast, dann ist das sicher nicht
meine Schuld.
Freundliche Grüße
Vinzenz
Ganz so doof bin ich dann doch nicht ;-)
Folgendes gibt kein Ergebnis (und die Werte liegen 100%-ig dazwischen):
"SELECT NAME, RECHTS, HOCH FROM dbName WHERE RECHTS BETWEEN 0 AND 10000000 AND HOCH BTWEEN 0 AND 10000000 ORDER BY NAME"
Paul
Hallo
Ganz so doof bin ich dann doch nicht ;-)
Folgendes gibt kein Ergebnis (und die Werte liegen 100%-ig dazwischen):HOCH BTWEEN
wirft einen Syntaxfehler. BETWEEN ist tägliches Brot, funktioniert zuverlässig!
Freundliche Grüße
Vinzenz
Oh, oh! Da bin ich also doch doof :lol:
Funktionieren tut's jetzt. Leider ist die Abfrage mit BETWEEN ca. 20% langsamer als mit < >.
Paul
Yerf!
Da wird bei mir gar nicht gefunden:
"SELECT TOP 10 NAME, RECHTS, HOCH FROM
dbName WHERE RECHTS BETWEEN ? AND ? AND HOCH BTWEEN ? AND ? ORDER BY NAME"
^^
Oder bin ich zu doof?
Ich enthalte mich der Aussage...
Gruß,
Harlequin
Vielen Dank für Deine Geduld!
Leider verstehe ich nicht allzuviel davon :-(
das kommt drauf an, wann die sortierunng ausgeführt wird....
Wie kann ich das beeinflussen?
Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut,...
Wo finde ich den?
sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ?
Was sind geeignete Indizes?
auch sehe ich das ">" Zeichen als kritisch an.
Warum?
Paul
yo,
das kommt drauf an, wann die sortierunng ausgeführt wird....
Wie kann ich das beeinflussen?
nur mit TOP alleine gar nicht
Nun aber zurück zu deinem Problem, hast du dir den Ausfürhungsplan angeschaut,...
Wo finde ich den?
bin ich was MSSQL angeht überfragt, aber googeln sollte bestimmt ergebnisse aufzeigen.
sind geeignte Indizes gestezt, um deine Bedingungen in der WHERE klausel abzudecken ?
Was sind geeignete Indizes?
tuning ist die königsdiziplin was die datenbank-administration betrifft. selbst profis werden dabei regelmäßig überrascht. Hier gilt probieren über studieren, grundsätzlich isnd spalten ind er WHERE klausel geiegnte Kanditaten für einen Index, wobei ich zusammengesetzte schlüssel einsetzen würde.
auch sehe ich das ">" Zeichen als kritisch an.
Warum?
ein index ist eine sortierung, die man sich wie seitenzahlen vorstellen kann. wenn du nun nach einer bestimmten seite nachschaust, dann findest du die seite im buch recht schnell, schließlich sind die seiten ja sortiert, es sei den der autor hat sich einen spass erlaubt. wenn ich nun aber sage, zeige mir alle seiten größer 100, dann kann ist das natürlich wesentlich ungenauer.
Ilja