2014-09-27 9 views
11

To zaczęło się od this question, ale teraz wydaje się bardziej odpowiednio zapytać, ponieważ zdałem sobie sprawę, że jest to pytanie związane z DTU.Liczba operacji wybierania prostego (id) używa 100% DTU Azure SQL

Zasadniczo trwania:

select count(id) from mytable 

EDIT: Dodawanie gdzie klauzula nie wydaje się pomóc.

Czy biorąc między 8 a 30 minut do uruchomienia (podczas gdy to samo zapytanie na lokalnej kopii SQL Server trwa około 4 sekund).

Poniżej przedstawiono zrzut ekranu zakładki MONITOR w portalu Azure po uruchomieniu tego zapytania. Uwaga Zrobiłem to, nie dotykając bazy danych przez około tydzień, a raportowanie Azure użyłem tylko 1% moich DTU.

enter image description here

Kilka dodatkowych rzeczy:

  • W tym konkretnym teście, zapytanie zajęło 08: 27s uruchomić.
  • Podczas pracy powyższy wykres faktycznie pokazywał linię DTU na poziomie 100% przez pewien okres.
  • Baza danych jest skonfigurowana jako Standardowy poziom usług z poziomem wydajności S1.
  • Baza danych ma około 3,3 GB i jest to największy stół (liczba ta zwraca około 2 000 000).

Doceniam to może być tylko moje ograniczone zrozumienie, ale jeśli ktoś mógłby wyjaśnić, czy to jest naprawdę oczekiwane zachowanie (czyli prosty licznik tak długo biegać i maxing mój DTUs) byłoby mile widziane.

+0

Odpowiedzi w pierwotnym pytaniu już dotyczą tego, co się dzieje. "Prosta" liczba jest rzeczywiście wymyślna, droga i musi przeskanować cały stół. * Nie rób tego *. Jeśli masz klauzulę WHERE, która korzystała z pól indeksowanych, optymalizator użyłby operacji wyszukiwania indeksu, co skutkowałoby znacznie lepszą wydajnością. Funkcja seek odczytuje indeks B-Tree, aby znaleźć pasujące wiersze przed obliczeniem sumy (tj. Znacznie mniej IO, lepsza prędkość). Jeśli używasz pola o wysokiej selektywności, będziesz musiał przeczytać znacznie mniej stron indeksu. –

+0

Po prostu FTR, "prosta" liczba nie jest wymyślona - to jest to, co muszę zrobić z/bez różnych klauzul gdzie. – chrisb

+0

Czy kiedykolwiek uzyskałeś satysfakcjonującą odpowiedź, dlaczego tak się dzieje? Widzę to samo z S2 (50 DTU) w bazie danych o pojemności 127 GB z pojedynczą tabelą 550 milionów wierszy, a zliczanie (1) trwa blisko godzinę. –

Odpowiedz

-1

select count

należy wykonać skanowanie indeksu klastrowego jeśli jest dostępny, a jego aktualne. Usługa Azure SQL powinna automatycznie aktualizować statystyki, ale nie odbudowuje indeksów automatycznie, jeśli są one całkowicie nieaktualne.

Jeśli jest dużo ruchu INSERT/UPDATE/DELETE na tej tabeli, sugeruję ręczne przebudowywanie indeksów co jakiś czas.

http://blogs.msdn.com/b/dilkushp/archive/2013/07/28/fragmentation-in-sql-azure.aspx

i tak pisać, aby uzyskać więcej informacji

SQL Azure and Indexes

+0

Dziękuję, odbudowałem indeksy, myślę, że używam SQL w artykule MSDN, z którym się łączyłeś. Ta tabela wydaje się mieć INDEKS CLUSTERED, który jest podzielony na 0,2%. O ile wiem, nie jest to problemem. – chrisb

+0

@chrisb Używasz spreparowanego przykładu, który gwarantuje uzyskanie kosztownych odczytów (w warunkach IO). To * nie * reprezentuje prawdziwe zapytania. Jeśli użyjesz nawet jednego pola indeksowanego w klauzuli "WHERE", będzie to znacznie szybsze –

+0

@chrisb Myślę, że właśnie tam będziemy musieli przyjrzeć się statystykom i planom wykonania. Oto podstawowy przewodnik, jak je włączyć: http://www.solidq.com/tuning-sql-azure-databases-part-1/ – b0rg

3

Od statystykach zapytań w swojej previous question widzimy:

300ms CPU time 
8000 physical reads 

8:30 wynosi około 500sec. Z pewnością nie jesteśmy związani z procesorem. 300 ms CPU przez 500sec prawie nie ma wykorzystania. Otrzymujemy 16 fizycznych odczytów na sekundę. To znacznie poniżej tego, co może dostarczyć dowolny dysk fizyczny. Również tabela nie jest w pełni zbuforowana, o czym świadczy obecność fizycznej IO.

Powiedziałbym, że jesteś zdławiony.S1 corresponds do

934 transakcje na minutę

dla niektórych definicji transakcji. To około 15 transów/sek. Może trafiasz na limit jednego fizycznego IO na transakcję ?! 15 i 16 są podejrzanie podobnymi liczbami.

Sprawdź tę teorię, aktualizując instancję do wyższego współczynnika skalowania. You might find that SQL Azure Database cannot deliver the performance you want at an acceptable price.

też należy stwierdzić, że wielokrotnie skanowania pół wyników stołowych w szybkim zapytania, ponieważ przydzielona pula buforów wydaje się pasować większość tabeli (tylko nie wszyscy z niego).

+0

Dzięki za analizę tutaj. Nie miałem czasu na zweryfikowanie tego (jeśli/kiedy to zrobię, oznaczę to jako poprawne), ale myślę, że prawdopodobnie jesteś tutaj - byłem zaskoczony, że proste obliczenie ... może zająć tak wiele DTU. Nie jestem super doświadczony z tej strony SQL Server, więc dla wielu może się okazać, że jest to tak kosztowna operacja. – chrisb

+0

Zdefiniuj "drogi". Wymaga to zeskanowania tabeli (lub jej indeksu). Wydaje mi się, że to ma sens, że powoduje to IO proporcjonalnie do rozmiaru stołu. Wytwarza niewielkie obciążenie procesora. – usr

+0

Sądzę, że mam na myśli kosztowne pod względem DTU, za które płacisz za różne poziomy SQL Azure. – chrisb

0

Miałem ten sam problem. Aktualizowanie statystyk za pomocą pełnego skanowania w tabeli rozwiązało:

update statistics mytable with fullscan