2010-08-03 14 views
6

Query 1: 10 kodów, które wykonuje maksymalny czasjakie jest równoważne zapytanie w mysql?

select top 10 
    source_code, 
    stats.total_elapsed_time/1000000 as seconds, 
    last_execution_time from sys.dm_exec_query_stats as stats 
cross apply(SELECT 
       text as source_code 
      FROM sys.dm_exec_sql_text(sql_handle)) AS query_text 
order by total_elapsed_time desc 

QUERY2: 10 kodów, które zajmuje maksymalnie physical_reads

select top 10 
    source_code, 
    stats.total_elapsed_time/1000000 as seconds, 
    last_execution_time from sys.dm_exec_query_stats as stats 
cross apply(SELECT 
       text as source_code 
      FROM sys.dm_exec_sql_text(sql_handle)) AS query_text 
order by total_physical_reads desc 

pobrane z tego article

+0

Dziękuję Johnowi za edycję, to powinno sprawić, że pytanie będzie jaśniejsze: jak zdobyć: Top 10 kodów, które zabierają maksymalny czas i kody Top 10, które pobierają maksimum physical_reads w MYSQL. – Bart

Odpowiedz

5

W MySQL trzeba uchwycić te informacje z pliku dziennika, a nie za pomocą zapytania. Ktoś prawdopodobnie powie Ci, że zapytanie jest możliwe, ale nie są one dla ciebie uczciwe. Zobacz:

http://dev.mysql.com/doc/refman/5.1/en/log-tables.html "Obecnie logowanie do tabel powoduje znacznie więcej narzutu na serwer niż logowanie do plików."

.. Wystarczająco istotne, że jeśli zadajesz to pytanie, nie chcesz z niego korzystać.

Teraz twoje pytanie brzmi "jak to zrobić z plikiem dziennika?". Liczba fizycznych odczytów dla zapytania nie jest zapisywana w wersjach programu MySQL. Jest jednak dostępny na serwerze Percona. Wzmocnienie jest niesamowite (nawet jeśli jestem stronniczy, pracuję dla Percona):

http://www.percona.com/docs/wiki/patches:slow_extended

Kolejne pytanie staje się jak można agregować dziennik, dzięki czemu można znaleźć te informacje. W tym celu proponuję mk-query-digest. http://www.maatkit.org/doc/mk-query-digest.html.

1

SELECT TOP 10 ... jest SELECT ... LIMIT 10 w MySQL. Jeśli pytasz o CROSS APPLY, który nie różni się zbytnio od INNER JOIN, zobacz When should I use Cross Apply over Inner Join?

+0

właściwie sam pyta o to, jak znaleźć zapytania SQL, które najdłużej wykonano. –

0
select 
source_code, 
stats.total_elapsed_time/1000000 as seconds, 
last_execution_time from sys.dm_exec_query_stats as stats 
inner join(SELECT 
      text as source_code 
     FROM sys.dm_exec_sql_text(sql_handle)) AS query_text 
order by total_elapsed_time desc 
limit 10 

 

select 
source_code, 
stats.total_elapsed_time/1000000 as seconds, 
last_execution_time from sys.dm_exec_query_stats as stats 
inner join(SELECT 
      text as source_code 
     FROM sys.dm_exec_sql_text(sql_handle)) AS query_text 
order by total_physical_reads desc 
limit 10 
+0

Proszę mnie poprawić, jeśli się mylę, ale nie sądzę, że te obiekty zarządzania dynamicznego (sys.dm_exec_query_stats, sys.dm_exec_sql_text) istnieją w MySQL. –

+0

Oic, przepraszam. Nigdy nie zauważam tej części. Wyrzucony i przeoczony jak normalny stół –