Langsame Abfrage mit unerwarteten index-scan

Ich habe diese Abfrage:

SELECT *
FROM sample
   INNER JOIN test ON sample.sample_number = test.sample_number
   INNER JOIN result ON test.test_number = result.test_number
   WHERE sampled_date BETWEEN '2010-03-17 09:00' AND '2010-03-17 12:00'

den größten Tisch hier ist das ERGEBNIS, Sie enthält 11,1 M records. Die linken 2 Tabellen über 1M.

diese Abfrage funktioniert, langsam (mehr als 10 Minuten) und zurück über 800 Einträgen. Ausführung von plan zeigt, "clustered index scan" (über dem Primärschlüssel (Resultat.result_number, die eigentlich gar nicht in der Abfrage)) über alle 11M records.
ERGEBNIS.TEST_NUMBER ist, einen gruppierten Primärschlüssel.

wenn ich 2010-03-17 09:00-2010-03-17 10:00 - ich bekomme etwa 40 Datensätze. es führt für 300ms. und der plan zeigt index seek (über das Ergebnis.test_number index)

wenn ich ersetzen Sie * in der SELECT-Klausel zur Folge.test_number (abgedeckt mit index) - dann werden alle zu schnell im ersten Fall auch. diese Punkte zu hdd-IO-Probleme, aber nicht klärt wechselnden plan.

so, irgendwelche Ideen?

UPDATE:
sampled_date ist in Tabelle Probe und fallenden index.
weitere Felder aus dieser Abfrage: testen.sample_number bedeckt ist, die durch den index und Ergebnis.test_number zu.

UPDATE 2:
offensichtlich als sql-server in einer beliebigen Gründen nicht verwenden möchten index.

habe ich ein kleines experiment: ich entfernen Sie die INNERE VERKNÜPFUNG mit dem Ergebnis, wählen Sie alle testen.test_number und danach tun

SELECT * FROM RESULT WHERE TEST_NUMBER IN (...)

diese, natürlich, arbeitet schnell. aber ich kann nicht bekommen, was ist der Unterschied und warum query optimizer wählen Sie solche unangebrachten Art und Weise, um Daten auszuwählen, die im 1. Fall.

UPDATE 3:
nach dem sichern der Datenbank und der Wiederherstellung der Datenbank mit dem neuen Namen - beide Anträge schnell arbeiten wie erwartet auch auf viel mehr Bereiche...

so gibt es spezielle Befehle zu bereinigen oder zu optimieren, was auch immer, werden kann dies relevant? 🙁

  • Gibt es einen index nur auf Sampled_date? Welchen SQL-server verwendest du? Was für ein Tisch ist sampled_date in?
  • sampled_date IN der Probe natürlich. und es ist bedeckt mit index, natürlich auch (index-Suche, die für diesen index im plan immer). sql 2000. "Gibt es einen index nur auf Sampled_date?" ich versteh das nicht 🙁
  • Gibt es einen index, der nur Spalte ist Sampled_date?
  • yep. es ist ein index besteht nur aus der PROBE.SAMPLED_DATE (und nicht mehr Indizes enthält dieses Feld mit der linken-den meisten Teil)
  • versuchen Sie, wählen Sie 'x' anstelle von select *. wie schnell ist es? vielleicht ist es die Menge der Daten, die Sie zurückgeben. wenn es die Menge der Daten (800 Zeilen) ist das problem, versuchen Sie, um den Seitenumbruch der Ergebnisse
  • die Abfrage langsam, wenn ich versuche, wählen Sie ein Feld aus anderen ERGEBNIS zu FÜHREN.TEST_NUMBER
  • ich denke, das ist unmöglich, jedes Feld sollte immer noch schneller sein. die joins und wheres tun die Projektion von Daten, und wählen Sie werden einfach nur wählen Sie aus den projizierten Daten. so auch eine einfache select 'x' oder wählen Sie 1, sollte so schnell wie wählen Sie Ergebnis.test_number. nur meine Vermutung
  • yep. wählen Sie 1, und wählen Sie Ergebnis.test_number sind schnell. weil 1 ist eine statische und Ergebnis.test_number entnommen index während der index-Suche. ABER wenn wir WÄHLEN Sie ERGEBNIS.NAMEN, die nicht behandelt mit index sql-server zu tun haben Lesevorgänge von der Festplatte, um Daten abzurufen. und wie ich schon sagte, diese Tatsache nicht klärt, warum diese änderungen query plan 🙁
  • versuchen composite-index auf test_number und der name der Ergebnis Tabelle
  • Buen: dies wird helfen, natürlich, aber es gibt ~50 Felder in der Ergebnistabelle und ~20 erforderlich ist. bauen-index von über 20 Felder, die nur für eine Abfrage ist es nicht Wert imo. ich bevorzuge zu schauen, für andere Lösungen, die helfen, die server zu wissen, dass suchen besser dann Scannen Sie in diesem Fall.

InformationsquelleAutor zerkms | 2010-03-17
Schreibe einen Kommentar