Mam problem ze stosunkowo prostym zapytaniem i planem wykonania Access wybierz dla niego.Jak mogę ustawić MS-Access wybrać inny/właściwy plan wykonania dla mojego zapytania
Zapytanie jest tej postaci
SELECT somethings
FROM A INNER JOIN (B INNER JOIN (C INNER JOIN D ON ...) ON ...) ON ...
WHERE A.primaryKey= 1 AND D.d = 2;
C i D mają względnie kilka rzędów. A i B mają kilka tysięcy rzędów.
Zapytanie, które zwraca 2 wiersze (nie ma pewności, czy jest to istotne) jest naprawdę wolne. Działa w ciągu 17 sekund. Jeśli usunę część AND D.d = 2
klauzuli where, zapytanie zwróci teraz 4 wiersze i zostanie uruchomione natychmiast.
Tak więc rozumiem, że silnik JET może natychmiast uruchomić zapytanie bez filtra w D.d, a następnie natychmiast wykonać filtr (tylko 4 wiersze do przefiltrowania). Dlatego nie powinno być zbyt długo, aby uruchomić zapytanie z filtrem D.d = 2
.
Próbowałem utworzyć kwerendę bez filtru i zawrzeć ją w innym zapytaniu, które odfiltrowałoby wynik, ale wciąż jest wolne. Domyślam się, że silnik JET jest wystarczająco inteligentny, aby "spłaszczyć" pod-zapytania, aby wynik był taki sam.
Ponieważ nie mogłem wykonać zapytania, tak jak chciałem, skorzystałem z funkcji JETSHOWPLAN, aby program Access wygenerował plan wykonania. Oto, co znalazłem:
Dla szybkiego zapytania (bez pytania D.d = 2
) pierwszym krokiem planu kwerend jest zastosowanie filtru A.primaryKey = 1
w tabeli A. Rezultatem jest zbiór danych z 1 rzędu z ponad 30000. Wtedy połączenia wydają się być wykonywane od A do D przy użyciu indeksu z zestawem danych, który nigdy nie przekracza 4 wierszy.
Powolne zapytanie wydaje się być wykonane w kolejności odwrotnej. D i C są połączone najpierw, a następnie testowane jest D.d = 2
. Następnie wykonywane są sprzężenia od C do A. W ten sposób dane, które muszą być łączone z D na C, z C na B iz B na A są znacznie większe. Po wykonaniu wszystkich powiązań i przed wykonaniem A.primaryKey=1
zestaw danych będzie miał 120 000 wierszy.
Czy istnieje sposób wymuszenia odpowiedniego planu zapytania w programie Access?
Mam nadzieję, że było jasne. Daj mi znać, jeśli chcę opublikować plany zapytań. Nie zrobiłem tego, ponieważ są dość duże.
Dzięki z góry,
MP
Ponieważ nie można dostarczyć wskazówek do planowania zapytań, ja podejrzewasz, że jesteś SOL. Jeśli jest to krytyczne z punktu widzenia wydajności, możesz dołączyć szybką część zapytania do tabeli scratch i użyć jej dla innego zapytania "D.d = 2". Wiem, że brzmi to paskudnie (jest!), Ale nie wiem, co jeszcze mógłbyś zrobić, oprócz życia z powolnością pojedynczego zapytania, które masz teraz. – HansUp
@HansUp: Dzięki za twój wkład. Obawiałem się, że będę musiał użyć tak brzydkiego hacka, ale jeśli nie znajdę innego rozwiązania, będę musiał użyć jednego. Moi użytkownicy czekają na wynik tego zapytania kilka razy dziennie, a 17 sekund to długi czas, kiedy wszystko co robisz, to gapienie się na ekran. –