как доказать 2 SQL-заявления эквивалентны - PullRequest
2 голосов
/ 02 февраля 2011

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

1 Ответ

0 голосов
/ 08 февраля 2011

Я бы предложил изучить реляционную алгебру (как указал Мчл). Это самая важная концепция, которая вам нужна, если вы хотите серьезно относиться к оптимизации запросов и правильному проектированию баз данных.

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

create view original as select xxx yyy zzz;
create view new as select xxx yyy zzz;
-- If the amount differs something is quite obviously very wrong
select count(*) from original;
select count(*) from new;
-- What is missing from the new one?
select *
from original o
where not exists (
 select * 
 from new n
 where o.col1=n.col2 and o.col2=n.col2 --and so on
);
-- Did something extra appear?
select *
from new o
where not exists (
 select *
 from old n
 where o.col1=n.col2 and o.col2=n.col2 --and so on
)

Также, как отмечают другие в комментариях, вы можете передать оба запроса оптимизаторам продукта, с которым вы работаете. Большую часть времени вы получаете что-то, что можно проанализировать с людьми, составлять чертежи путей выполнения с влиянием подзапросов на производительность и т. Д. Это чаще всего делается с помощью чего-то вроде

explain plan for 
select * 
from ...
where ...
etc
...