2012-04-27 2 views
1

Мой вопрос основан на среде T-SQL, SQL Server, но ее область применения не ограничивается этой технологией. Я работаю над базой данных с довольно сложной бизнес-логикой, с существующими представлениями, хранимыми процедурами и новыми для разработки. С помощью сравнений различных запросов или их части у меня есть сильное чувство, что есть секции, выполняющие ту же работу с другой компоновкой, но, конечно, для реорганизации всего беспорядка мне нужно что-то большее, чем чувство; поэтому я пытаюсь определить способ продемонстрировать, что два утверждения эквивалентны.Оценка эквивалентности запросов

Очевидным, но слабым ответом может быть удостовериться, что два запроса A и B производят один и тот же набор записей: если A является подмножеством B и B является подмножеством A, они являются одним и тем же набором записей; но я не уверен, что это хорошая идея, потому что, конечно, набор записей не является запросом, результаты могут зависеть от данных и значений конкретных параметров. Мои вопросы: есть способ доказать эквивалентность двух разных запросов? Я бы сказал, да, потому что оптимизация, выполняемая базой данных, должна работать над этим. Кто-то может предоставить мне некоторый указатель на документацию или книги, копающие в этом? Если нет общего метода доказательства эквивалентности, существует какой-то умный подход, основанный на регрессионном тестировании, выполненном в соответствии с некоторой эффективной эвристикой, которая выполняет эту работу?

Отредактировано позже: в случае, обратное проектирование запросов (вручную?) С помощью реляционной алгебры, может быть лучшим методом для оценки эквивалентности запроса вместо использования других запросов и/или компьютера? Есть автоматизированные инструменты, помогающие в выполнении этой «обратной инженерии», в случае?

Большое спасибо за помощь

+0

http://stackoverflow.com/questions/4868364/how-to-prove-2-sql-statements-are-equivalent и http://dl.acm.org/citation.cfm?id=111212&dl= –

ответ

1

Возможно, вы не можете это доказать, так как проблема кажется NP-полной; проверьте это SO question on query equivalence (это один о Oracle, но есть несколько ответов/ссылок, которые должны быть релевантны для вас).

0

Вы можете проверить планы выполнения двух запросов. Если они одинаковы, у вас есть свой ответ!

+0

Я уверен, что можно написать несколько довольно волнующих запросов, которые побеждают наилучшие усилия оптимизатора, но на самом деле вычисляют одни и те же результаты (хотя и субо-оптимально). –

0

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

+0

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

0

Для этого вам потребуется реализовать для этого генератор «канонического плана запроса» («оптимальный план запроса», создаваемый СУБД, может быть недетерминированным). В большинстве случаев использование алфавитного порядка терминов и таблиц в качестве тай-брейкера приведет вас туда.

0

Я сомневаюсь, что вы собираетесь быть в состоянии формально доказательства или опровергнуть это, но мой взгляд на это было бы

  • идентифицировать все случаи использования
  • определить все граничные значения
  • определить все параметры

и получить план тестирования от этого.Это может потребовать от вас

  • создать Testdata для каждого случая
  • запустить оба запросы к этим данным
  • сравнить результаты

Если вы не нашли каких-либо различий после тестирования, вы можете разумно заверил, что оба утверждения равны друг другу.

Смежные вопросы