Математична рівність двох операторів SQL


9

Чи є спосіб перевірити математичну рівність двох операторів SQL?

У мене є два оператори SQL:

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

Запуск обох висловлювань щодо даних та порівняння результатів зовсім не допомагає.

Набір математики, що стоїть за твердженнями, повинен бути оцінений, як це робить рішення рівняння.

Поза моїм питанням такі речі:

  • порівняння, що не є рівність (більша, менша ніж, LIKE, ...)
  • збережені процедури або тригери
  • Загальні табличні вирази (З)

В обсязі:

  • Підселекти: WHERE
  • ПРИЄДНАЄТЬСЯ

Частковим рішенням буде порівняння планів виконання 2 запитів. Якщо плани виконання однакові, то вони рівні. Однак відносини не працюють обома способами. Можуть бути 2 логічно еквівалентні запити, які мають різні плани виконання.
BuahahaXD

1
@BuahahaXD: це неправда. select * from foo where id = 4швидше за все, буде той самий план виконання, якselect * from foo where id = 2
a_horse_with_no_name

@a_horse_with_no_name Я перевірив його на SQL Server і отримав 2 різних XML-файли. Параметри були включені як вузол <ParameterList> у файл XML. Візуально ці плани були однакові (сканування таблиці + вибір). Але я вважаю, що ви можете мати рацію щодо порівняння планів виконання.
BuahahaXD

1
@a_horse_with_no_name є правильним, коли мова йде про унікальні ключі. Для всіх інших можливо select * from foo where id = 4і select * from foo where id = 2для двох різних планів виконання, якщо 1) статистика індексу не є актуальною та 2) навіть якщо статистика індексу є актуальною, ключовий розподіл ідентифікатора недоступний (за умови, що ідентифікатор не є унікальним ключем).
RolandoMySQLDBA

Відповіді:


6

Яка математична рівність двох операторів SQL? Для мене два запити еквівалентні, якщо при заданні обох однакових даних будь-якого набору даних вони повертають один і той же набір результатів.

Як ви зазначали, запити SQL, набір реляційних алгебр , можуть бути дуже складними. Ми можемо змішувати підзапити, використовувати збережені процедури та функції ( детерміновані чи ні), завдяки чому запит буде схожий на реальний код . Якщо ви говорите про подібні запити, то це буде дуже важко. Насправді це, мабуть, не відрізняється від проблеми "два алгоритми еквівалентні".

За таких умов це, мабуть, неможливо.

Однак ...

... це може бути здійснено, якщо два запити, які ви хочете порівняти, є суворо встановленими операціями. Якщо так, ви можете перетворити запити у реляційну алгебру, а потім опрацювати її, дотримуючись правил еквівалентності . Якщо у вас є вибір / обмеження з нетривіальними булевими умовами, то, можливо, вам доведеться довести, що умови тісей також рівнозначні. Тоді вам потрібно буде покластися на булеву алгебру, і ви, ймовірно, в кінцевому підсумку будете робити таблицю правдивості .

Як ви бачите, над цим буде багато роботи, і, наскільки я знаю, нічого не існує, щоб обчислити все це автоматично. Тим не менш, я знайшов кілька інструментів, які можуть бути вам корисними, якщо ви хочете вирішити завдання:


Моє запитання лише про встановлені операції. Я оновив питання. Це пов'язано з проблемою "два еквівалентні алгоритми". Але контекст є обмеженим, в моєму просторі лише основні операції множин, з'єднань, підселектів.
guettli

3

Неможливо перевірити смислову еквівалентність у кінцевому часі за визначенням, див . Теорему Райса :

для будь-якої нетривіальної властивості парціальних функцій не існує загального та ефективного методу для визначення того, чи алгоритм обчислює часткову функцію з цим властивістю.


2
Це лише просто не коментар. Чи можете ви розширити сферу застосування Рису до цього контексту, будь ласка.
Майкл Грін

Навіть якби це було теоретично можливо, поточний стандартний синтаксис SQL є настільки бароковим, що це було б неможливо на практиці
Джеймс Андерсон

1
З поясненням ОП виглядає, що питання стосується скоріше логічної еквівалентності, ніж семантичної еквівалентності. Справжнє запитання: чи можемо ми перетворити оператори SQL в математичний вираз і потім оцінити логічну еквівалентність?
ForguesR

2

користувач dba Lennart вказав мені на цей проект:

http://cosette.cs.washington.edu/

Cosette - це автоматизований доказ для перевірки еквівалентності запитів SQL. Він формалізує істотний фрагмент SQL у програмі Coq Proof Assistant та символічній віртуальній машині Rosette. Він повертає або офіційне підтвердження рівноваги, або контрприклад для пари заданих запитів.


1

Один із способів зробити це - створити аналізатор або, краще, використовувати існуючий. Я вважаю, що C # має клас TSQLParser і має метод Parse (). Аналізатор розбить ваш запит на підкласи, які ви зможете порівняти.


1

Якщо ви шукаєте тест еквівалентності на основі Теорії набору, найкращим варіантом буде перетворити будь-які WHEREумови, які можна перетворити на тип JOIN(внутрішні чи зовнішні) та відновити оператор. Сюди входять IN subselectі EXISTS subselectбудь-які інші умови WHEREпункту, що містить слово SELECT. Якщо ви виконаєте це в обох операторах SQL, у вас з'явиться новий FROMпункт, який представляє інтеграцію / математику, засновану на наборах, яка вас цікавить. Тоді ви можете просто візуально порівняти ці два твердження. Якщо ви шукаєте автоматизований спосіб зробити все це, я не знаю інструменту, який може зробити саме це.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.