Ich habe folgende Frage:
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'
die größte Tabelle hier ist RESULT, sie enthält 11,1M Datensätze. Die linken 2 Tabellen etwa 1M.
Diese Abfrage arbeitet langsam (mehr als 10 Minuten) und liefert etwa 800 Datensätze. Der Ausführungsplan zeigt geclusterter Index-Scan (über seinen PRIMARY KEY (result.result_number, der eigentlich nicht an der Abfrage beteiligt ist)) über alle 11M Datensätze. RESULT.TEST_NUMBER ist ein geclusterter Primärschlüssel.
Wenn ich 2010-03-17 09:00 auf 2010-03-17 10:00 ändere, erhalte ich etwa 40 Datensätze. Es wird für 300ms ausgeführt. und Plan zeigt Indexsuche (über result.test_number index)
wenn ich * in SELECT-Klausel zu result.test_number (mit Index abgedeckt) ersetzen - dann werden alle schnell im ersten Fall zu. dies deutet auf hdd IO-Probleme, aber nicht klärt ändern Plan.
Also, irgendwelche Ideen?
UPDATE: sampled_date befindet sich in der Tabelle sample und wird durch den Index abgedeckt. andere Felder dieser Abfrage: test.sample_number ist durch den Index abgedeckt und result.test_number ebenfalls.
UPDATE 2: offensichtlich als Sql-Server in allen Gründen nicht wollen, um Index zu verwenden.
Ich habe ein kleines Experiment gemacht: Ich habe INNER JOIN mit result entfernt, alle test.test_number ausgewählt und danach
SELECT * FROM RESULT WHERE TEST_NUMBER IN (...)
dies, natürlich, funktioniert schnell. aber ich kann nicht bekommen, was ist der Unterschied und warum Abfrage-Optimierer wählen Sie solche unangemessenen Weg, um Daten im ersten Fall auswählen.
UPDATE 3: nach dem Sichern der Datenbank und dem Wiederherstellen der Datenbank mit dem neuen Namen - beide Anfragen funktionieren schnell wie erwartet, auch bei viel mehr Bereichen...
Gibt es irgendwelche speziellen Befehle zum Säubern oder Optimieren oder was auch immer, die in diesem Zusammenhang relevant sein können? :-(