Доказательство эквивалентности SQL-запроса

«Лучший» способ разделить ноутбук Jupyter - просто разместить его на GitHub (и просмотреть его напрямую) или какую-то другую общедоступную ссылку и использовать Jupyter Notebook Viewer . Когда конфиденциальность больше связана с проблемой, тогда есть альтернативы, но это, конечно, более сложно, в Jupyter нет встроенного способа, но есть несколько вариантов:

Удерживайте свой собственный nbviewer

GitHub и Jupyter Notebook Veiwer используют один и тот же инструмент для рендеринга .ipynb файлов в статический HTML, этот инструмент является nbviewer .

Инструкции по установке сложнее, чем Я хочу пойти здесь, но если ваша компания / команда имеет общий сервер, который не требует доступа к паролю, вы можете разместить nbviewer на этом сервере и перенаправить его на свой сервер с полномочиями.

Настройте сценарий развертывания

Если вам не обязательно нужно live , чтобы обновить HTML, вы можете настроить сценарий на своем сервере с полномочиями, который будет просто использовать встроенные параметры экспорта Jupyter для создания статических файлов HTML, а затем отправить их на более доступный для общественности сервер.

Удачи!

22
задан Matthew Watson 19 September 2008 в 00:05
поделиться

7 ответов

Лучшее, которое можно сделать, сравнивают 2 вывода запроса на основе данного набора исходных данных, ища любые различия. Сказать, что они будут всегда возвращать те же результаты для всех исходных данных действительно, зависит от данных.

Для Oracle один из лучше, если не лучшие (очень эффективные) подходы здесь ( Ctrl + F Сравнение Содержания Двух Таблиц):
http://www.oracle.com/technetwork/issue-archive/2005/05-jan/o15asktom-084959.html

, Который сводится к:

select c1,c2,c3, 
       count(src1) CNT1, 
       count(src2) CNT2
  from (select a.*, 
               1 src1, 
               to_number(null) src2 
          from a
        union all
        select b.*, 
               to_number(null) src1, 
               2 src2 
          from b
       )
group by c1,c2,c3
having count(src1) <> count(src2);
13
ответ дан Valery Viktorovsky 29 November 2019 в 05:10
поделиться

Это довольно легко сделать.

Позволяет, предполагают, что Ваши запросы называют a, и b

минус b

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

тогда делают

b минус

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

2
ответ дан EvilTeach 29 November 2019 в 05:10
поделиться

Это звучит мне как NP полная проблема. Я не уверен, что существует верный способ доказать такого рода вещь

9
ответ дан Rik 29 November 2019 в 05:10
поделиться

Поставщики DBMS работали над этим для очень, очень долгое время. Как сказанный Rik, это , вероятно тяжелая проблема, но я не думаю, что любой формальный анализ полноты NP пространства задач был сделан.

Однако Ваш лучший выбор состоит в том, чтобы усилить Ваш DBMS как можно больше. Все системы DBMS переводят SQL в своего рода план запросов. Можно использовать этот план запросов, который является абстрактной версией запроса, как хорошая начальная точка (DBMS сделает большую оптимизацию, сглаживая запросы в более осуществимые модели).

ПРИМЕЧАНИЕ: современный DBMS использует анализатор "на основе издержек", который недетерминирован через обновления статистики, таким образом, планировщик запроса, со временем, может изменить план запросов для идентичных запросов.

В Oracle (в зависимости от Вашей версии), можно сказать оптимизатору переключаться с основанного на стоимости анализатора на детерминированный основанный на правиле анализатор (это упростит анализ плана) с подсказкой SQL, например,

SELECT /*+RULE*/ FROM yourtable

, основанный на правилах оптимизатор был удержан от использования с тех пор 8i, но это все еще бродит вокруг даже через 10 г (я не знаю приблизительно 11). Однако основанный на правилах анализатор намного менее сложен: коэффициент ошибок потенциально намного выше.

Для дополнительных материалов для чтения более универсальной природы, IBM довольно плодотворно работала с их патентами оптимизации запросов. Этот здесь на методе для преобразования SQL к "абстрактному плану" является хорошей начальной точкой: http://www.patentstorm.us/patents/7333981.html

1
ответ дан Matt Rogish 29 November 2019 в 05:10
поделиться

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

1
ответ дан Kibbee 29 November 2019 в 05:10
поделиться

Вы не делаете.

, Если Вам нужен высокий уровень уверенности, что изменение производительности, например, не изменило вывод запроса тогда, тестируют ад это.

, Если Вам нужен действительно высокий уровень уверенности.. тогда errrm, тест это еще больше.

Значительный уровень тестирования не то, что трудно починить для SQL-запроса. Запишите proc, который выполнит итерации вокруг большого / полного набора возможного paramenters, и называть каждый запрос с каждым набором параметрических усилителей и писать выводы в соответствующие таблицы. Сравните эти две таблицы, и там у Вас есть он.

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

0
ответ дан Michael OShea 29 November 2019 в 05:10
поделиться

Это сделает трюк. Если этот запрос возвращает нулевые ряды, два запроса возвращают те же результаты. В качестве бонуса он работает как единственный запрос, поэтому вам не нужно беспокоиться о настройке уровня изоляции, чтобы данные не изменялись между двумя запросами.

select * from ((<query 1> MINUS <query 2>) UNION ALL (<query 2> MINUS <query 1>))

Вот удобный скрипт оболочки для этого:

#!/bin/sh

CONNSTR=$1
echo query 1, no semicolon, eof to end:; Q1=`cat` 
echo query 2, no semicolon, eof to end:; Q2=`cat`

T="(($Q1 MINUS $Q2) UNION ALL ($Q2 MINUS $Q1));"

echo select 'count(*)' from $T | sqlplus -S -L $CONNSTR
1
ответ дан 29 November 2019 в 05:10
поделиться
Другие вопросы по тегам:

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