Измерение сложности SQL-операторов

Сложность методов на большинстве языков программирования может измеряться в цикломатической сложности со статическим исходным кодом анализаторы. Существует ли подобная метрика для измерения сложности SQL-запроса?

Достаточно просто измерить время, которое это берет запрос для возврата, но что, если я просто хочу смочь определить количество, насколько сложный запрос?

[Редактирование/Примечание] При получении плана выполнения полезно, который является не обязательно, что я пытаюсь определить в этом случае. Я не ищу, насколько трудный это для сервера для выполнения запроса, я ищу метрику, которая определяет, насколько трудный это было для разработчика для записи запроса, и как, вероятно, это должно содержать дефект.

[Редактируйте/Отмечайте 2] По общему признанию, существуют времена, когда измерение сложности не полезно, но существуют также времена, когда это. Для дальнейшего обсуждения той темы посмотрите этот вопрос.

27
задан Acumenus 20 April 2018 в 19:12
поделиться

7 ответов

Общие меры сложности программного обеспечения включают цикломатическую сложность (показатель сложности потока управления) и сложность Холстеда (показатель сложности арифметика есть).

«Поток управления» в запросе SQL лучше всего связан с операторами «и» и «или» в запросе.

«Вычислительная сложность» лучше всего связана с такими операторами, как SUM или неявные JOINS.

После того, как вы решили, как классифицировать каждую единицу синтаксиса SQL-запроса в зависимости от того, является ли он «потоком управления» или «вычислением», вы можете напрямую вычислить цикломатические меры или показатели Холстеда.

То, что оптимизатор SQL делает с запросами, я считаю абсолютно несущественным. Цель измерения сложности состоит в том, чтобы охарактеризовать, насколько сложно человеку понять запрос, а не насколько эффективно он может быть оценен.

Точно так же то, что говорит DDL, и независимо от того, задействованы ли представления или нет, не следует включать в такие меры сложности. Предположение, лежащее в основе этих показателей, заключается в том, что сложность механизма внутри используемой абстракции не интересна, когда вы просто вызываете ее, потому что, по-видимому, эта абстракция делает что-то, хорошо понятное кодировщику.Вот почему меры Холстеда и Cyclomatic не включают в свой подсчет вызываемые подпрограммы, и я думаю, вы можете убедительно доказать, что представления и информация DDL - это те «вызываемые» абстрактные выражения.

Наконец, насколько правильны или совершенно неправильны эти числа сложности, не имеет большого значения, если они отражают некоторую правду о сложности, и вы можете сравнивать их относительно друг друга. Таким образом, вы можете выбрать, какие фрагменты SQL являются наиболее сложными, отсортировать их все и сосредоточить внимание тестирования на самых сложных.

10
ответ дан 28 November 2019 в 05:46
поделиться

Я не знаю ни одного инструмента, который бы делал подобное, но мне кажется, что то, что могло бы сделать запрос более сложным, можно было бы измерить по: количество соединений количество условий где количество функций количество подзапросов количество приведений к разным типам данных количество утверждений case количество петель или курсоров количество шагов в транзакции

. Однако, хотя верно, что более сложные запросы могут показаться теми, которые имеют наиболее возможные дефекты, я считаю, что простые запросы, скорее всего, будут содержать дефекты, поскольку они более вероятны должны быть написаны кем-то, кто не понимает модель данных, и поэтому они могут работать правильно, но на самом деле возвращают неправильные данные. Так что я не уверен, что такая метрика много вам скажет.

1
ответ дан 28 November 2019 в 05:46
поделиться

В зависимости от вашей СУБД могут быть инструменты плана запроса, которые помогут вам проанализировать шаги, которые СУБД предпримет при получении вашего запроса.

SQL Server Management Studio Express имеет встроенный план выполнения запроса. У Pervasive PSQL есть свой поисковик планов запросов. У DB2 есть похожие инструменты (забыл, как они называются).

0
ответ дан 28 November 2019 в 05:46
поделиться

Хороший вопрос. Проблема в том, что для такого SQL-запроса, как:

SELECT * FROM foo;

сложность может зависеть от того, что такое «foo», и от реализации базы данных. Для такой функции, как:

int f( int n ) {
   if ( n == 42 ) {
      return 0;
   }
   else {
      return n;
   }
}

, такой зависимости нет.

Тем не менее, я думаю, что можно было бы предложить некоторые полезные метрики для SELECT, даже если они не очень точны, и мне будет интересно посмотреть, какие ответы это даст.

0
ответ дан 28 November 2019 в 05:46
поделиться

Я не уверен, что получение планов запроса ответит на вопрос: планы запросов скрывают часть сложности вычислений, выполняемых с данными до их возврата (или использования в фильтр); планы запросов требуют, чтобы значимая база данных была релевантной. На самом деле сложность и продолжительность исполнения несколько противоположны; что-то вроде «Хорошо, быстро, дешево - выберите любые два».

В конечном счете, речь идет о шансах сделать ошибку или непонимании кода, который я написал?

Что-то вроде:

  • количество таблиц раз (1
  • +1 на выражение соединения (+1 на внешнее соединение?)
  • +1 за предикат после WHERE или HAVING
  • +1 за GROUP BY выражение
  • +1 за UNION или ПЕРЕСЕЧЕНИЕ
  • +1 за вызов функции
  • +1 за CASE выражение
  • )
10
ответ дан 28 November 2019 в 05:46
поделиться

SQL-запросы являются декларативными, а не процедурными: они не определяют, как достичь своей цели. Механизм SQL создаст процедурный план атаки, и это может быть хорошим местом для поиска сложностей. Попробуйте изучить вывод оператора EXPLAIN (или EXPLAIN PLAN), это будет грубое описание шагов, которые движок будет использовать для выполнения вашего запроса.

2
ответ дан 28 November 2019 в 05:46
поделиться

Что ж, если вы используете SQL Server, я бы сказал, что вам следует посмотреть на стоимость запроса в плане выполнения (в частности, на стоимость поддерева).

Здесь - ссылка, которая описывает некоторые моменты, на которые следует обратить внимание в плане выполнения.

0
ответ дан 28 November 2019 в 05:46
поделиться
Другие вопросы по тегам:

Похожие вопросы: