Pomiar złożoności poleceń SQL

Złożoność metod w większości języków programowania może być mierzona w złożoności cyklomatycznej za pomocą statycznych analizatorów kodu źródłowego. Czy istnieje podobna metryka do pomiaru złożoności zapytania SQL?

To jest wystarczająco proste, aby zmierzyć czas potrzebny na zwrócenie zapytania, ale co, jeśli po prostu chcę być w stanie określić, jak skomplikowane jest zapytanie?

[Edytuj / Przypis] Chociaż uzyskanie planu realizacji jest przydatne, niekoniecznie to staram się zidentyfikować w tym case. Nie szukam tego, jak trudne jest wykonanie zapytania przez serwer, Szukam metryki, która określi, jak trudne było napisanie zapytania przez programistę i jak prawdopodobne jest, że zawiera ono usterkę.

[Edytuj / Przypis 2] Co prawda, są chwile, kiedy pomiar złożoności nie jest przydatny, ale są też chwile, kiedy tak jest. Aby uzyskać dalszą dyskusję na ten temat, zobacz to pytanie .

Author: A-B-B, 2010-07-28

9 answers

Typowe miary złożoności oprogramowania obejmują złożoność Cyklomatyczną (miara skomplikowania przepływu sterowania) i złożoność Halsteada (miara złożoności arytmetyki).

" przepływ sterowania "w zapytaniu SQL jest najlepiej związany z operatorami" and "I" or " w zapytaniu.

"złożoność obliczeniowa" jest najlepiej powiązana z operatorami takimi jak suma lub implicit JOINESES.

Gdy już zdecydujesz jak kategoryzować każdą jednostkę składni zapytania SQL jeśli chodzi o to, czy jest to "przepływ sterowania", czy "obliczenia", możesz bezpośrednio obliczyć miary Cyclomatic lub Halstead.

To, co optymalizator SQL robi dla zapytań i myślę, że jest absolutnie nieistotne. Celem miar złożoności jest scharakteryzowanie, jak trudno jest osobie zrozumieć zapytanie, a nie jak skutecznie można je ocenić.

Podobnie to, co mówi DDL lub czy widoki są zaangażowane, czy nie, nie powinno być uwzględniane w takich miarach złożoności. Założeniem stojącym za tymi metrykami jest to, że złożoność maszyn wewnątrz używanej abstrakcji nie jest interesująca, gdy po prostu ją przywołujesz, ponieważ przypuszczalnie ta abstrakcja robi coś dobrze zrozumianego przez kodera. Dlatego Halstead i Cyclomatic miary nie zawierają nazwane podprogramów w ich liczeniu, I myślę, że można zrobić dobry przypadek, że widoki i informacje DDL są te" wywoływane " abstrakcji.

Wreszcie, jak doskonale dobrze lub jak doskonale źle te liczby złożoności nie mają większego znaczenia, o ile odzwierciedlają pewną prawdę o złożoności i można je porównywać względem siebie. W ten sposób możesz wybrać, które fragmenty SQL są najbardziej złożone, posortować je wszystkie i skupić uwagę na testowaniu na najbardziej skomplikowanych.

 9
Author: Ira Baxter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-31 15:05:44

Nie jestem pewien, czy pobieranie planów zapytań odpowie na pytanie: plany zapytań ukrywają część złożoności obliczeń wykonanych na danych przed ich zwróceniem (lub użytą w filtrze); plany zapytań wymagają znaczącej bazy danych, aby była odpowiednia. W rzeczywistości złożoność i długość wykonania są nieco opposite; coś w stylu "dobry, szybki , tani-Wybierz dowolne dwa".

Ostatecznie chodzi o szanse popełnienia błędu, lub niezrozumienia kodu Pisałem?

Coś w stylu:

  • liczba tabel razy (1
  • + 1 na wyrażenie join (+1 na zewnętrzne połączenie?)
  • + 1 na predykat po WHERE LUB HAVING
  • +1 na GROUP BY wyrażenie
  • +1 na UNION lub INTERSECT
  • + 1 za wywołanie funkcji
  • +1 na CASE wyrażenie
  • )
 10
Author: pascal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 15:11:22

Zapraszam do wypróbowania mojego skryptu, który daje przegląd wielkości procedury składowanej, liczby zależności obiektu i liczby parametrów -

Oblicz złożoność procedury składowanej TSQL

 4
Author: Aalamjeet Rangi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-23 09:44:16

Zapytania SQL są deklaratywne, a nie proceduralne: nie określają, jak osiągnąć swój cel. Silnik SQL stworzy proceduralny plan ataku, który może być dobrym miejscem do szukania złożoności. Spróbuj przeanalizować wyjście instrukcji EXPLAIN( lub EXPLAIN PLAN), będzie to prymitywny opis kroków, których silnik użyje do wykonania Twojego zapytania.

 2
Author: Ned Batchelder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 14:05:39

Cóż, nie znam żadnego narzędzia, które zrobiłoby coś takiego, ale wydaje mi się, że to, co skomplikowałoby zapytanie, będzie mierzone przez: liczba przyłączeń liczba warunków gdzie liczba funkcji liczba zapytań podrzędnych liczba odlewów do różnych typów danych liczba stwierdzeń sprawy liczba pętli lub kursorów liczba kroków w transakcji

Choć prawdą jest, że im więcej zapytań comlex może wydawać się tych z największą możliwe wady, uważam, że proste są bardzo prawdopodobne, aby zawierać wady, ponieważ są one bardziej prawdopodobne, aby zostały napisane przez kogoś, kto nie rozumie modelu danych, a tym samym mogą wydawać się działać poprawnie, ale w rzeczywistości zwracają złe dane. Więc nie jestem pewien, czy taka metryka wiele ci powie.

 1
Author: HLGEM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 15:32:06

Cóż, jeśli używasz SQL Server powiedziałbym, że powinieneś spojrzeć na koszt zapytania w planie wykonania (w szczególności koszt poddtree).

Tutaj {[4] } znajduje się link, który omawia niektóre rzeczy, na które powinieneś spojrzeć w planie wykonania.

 0
Author: Abe Miessler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 14:05:57

W zależności od RDBMS mogą istnieć narzędzia planu zapytań, które pomogą Ci przeanalizować kroki, które RDBMS podejmie w pobieraniu zapytania.

SQL Server Management Studio Express ma wbudowany plan wykonywania zapytań. Pervasive PSQL ma swoją wyszukiwarkę planów zapytań. DB2 ma podobne narzędzia (zapomniałem jak się nazywają).

 0
Author: duraz0rz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 14:10:41

Dobre pytanie. Problem polega na tym, że dla zapytania SQL typu:

SELECT * FROM foo;

Złożoność może zależeć od tego, czym jest" foo " i od implementacji bazy danych. Dla funkcji typu:

int f( int n ) {
   if ( n == 42 ) {
      return 0;
   }
   else {
      return n;
   }
}
Nie ma takiej zależności.

Jednak myślę, że powinno być możliwe, aby wymyślić kilka przydatnych wskaźników dla wyboru, nawet jeśli nie są one bardzo dokładne, i będę zainteresowany, aby zobaczyć, jakie odpowiedzi to dostaje.

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-28 14:12:29

W przypadku braku narzędzi, które to umożliwią, pragmatyczne podejście polegałoby na zapewnieniu spójnego sformatowania analizowanych zapytań, a następnie policzeniu linii kodu.

Alternatywnie Użyj rozmiaru zapytań w bajtach podczas zapisywania do pliku (uważając, że wszystkie zapytania są zapisywane przy użyciu tego samego kodowania znaków).

Nie genialne, ale rozsądne proxy złożoności przy braku czegokolwiek innego myślę.

 0
Author: redcalx,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-09 13:16:37