22

2 つのクエリが機能的に同等であることをどのように証明しますか。たとえば、両方とも常に同じ結果セットを返します。


これを行っているときに特定のクエリを念頭に置いていたので、@ dougmanが提案したように、関連するテーブルの行の約10%以上を実行し、結果を比較して、場違いの結果がないことを確認しました。

4

9 に答える 9

14

最善の方法は、特定の入力セットに基づいて 2 つのクエリ出力を比較し、違いを探すことです。すべての入力に対して常に同じ結果が返されるかどうかは、実際にはデータに依存します。

Oracleの場合、最良のアプローチではないにしても優れたアプローチの1つ(非常に効率的)は次のとおりです(Ctrl+ F2つのテーブルの内容の比較):
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);
于 2008-09-18T15:16:50.300 に答える
9

これは、NP完全問題のように思えます。この種のことを証明する確実な方法があるかどうかはわかりません

于 2008-09-11T15:40:22.300 に答える
2

これはとても簡単です。

クエリの名前が a と b であると仮定しましょう

aマイナスb

あなたに空のセットを与えるべきです。そうでない場合。その後、クエリは異なるセットを返し、結果セットは異なる行を示します。

それからする

bマイナスa

それはあなたに空のセットを与えるはずです。その場合、クエリは同じセットを返します。空でない場合、クエリはいくつかの点で異なり、結果セットには異なる行が表示されます。

于 2008-09-19T01:23:24.053 に答える
1

これでうまくいきます。このクエリがゼロ行を返す場合、2 つのクエリは同じ結果を返しています。おまけとして、単一のクエリとして実行されるため、2 つのクエリ間でデータが変更されないように分離レベルを設定する必要はありません。

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
于 2010-01-23T04:18:08.650 に答える
1

DBMS ベンダーは、非常に長い間これに取り組んできました。Rik が言ったように、これはおそらく扱いにくい問題ですが、問題空間の NP 完全性に関する正式な分析は行われていないと思います。

ただし、最善の策は、DBMS を可能な限り活用することです。すべての DBMS システムは、SQL をある種のクエリ プランに変換します。クエリの抽象化されたバージョンであるこのクエリ プランを出発点として使用できます (DBMS は多くの最適化を行い、クエリをより実行可能なモデルにフラット化します)。

注: 最新の DBMS は、統計の更新間で非決定的な「コストベース」のアナライザーを使用するため、クエリ プランナーは時間の経過とともに、同一のクエリのクエリ プランを変更する可能性があります。

Oracle (バージョンによって異なります) では、SQL ヒントを使用して、オプティマイザーにコストベースのアナライザーから決定論的ルールベースのアナライザー (これにより計画分析が簡素化されます) に切り替えるように指示できます。

SELECT /*+RULE*/ FROM yourtable

ルールベースのオプティマイザは 8i から非推奨になりましたが、10g まで残っています (11 についてはわかりません)。ただし、ルールベースのアナライザーはそれほど洗練されていません。エラー率がはるかに高くなる可能性があります。

より一般的な性質をさらに理解するために、IBM はクエリ最適化の特許をかなり多用してきました。SQL を「抽象的な計画」に変換する方法に関するこちらの記事は、良い出発点です: http://www.patentstorm.us/patents/7333981.html

于 2008-09-11T18:42:58.350 に答える
1

気をつけろ!機能的な「同等性」はデータに基づいていることが多く、多くの場合の結果を比較することで 2 つのクエリの同等性を「証明」しても、データが特定の方法で変更されると、依然として間違っている可能性があります。

例えば:

SQL> create table test_tabA
(
col1 number
)

Table created.

SQL> create table test_tabB
(
col1 number
)

Table created.

SQL> -- insert 1 row

SQL> insert into test_tabA values (1)

1 row created.

SQL> commit

Commit complete.

SQL> -- Not exists query:

SQL> select * from test_tabA a
where not exists
(select 'x' from test_tabB b
where b.col1 = a.col1)

      COL1

----------

         1

1 row selected.

SQL> -- Not IN query:

SQL> select * from test_tabA a
where col1 not in
(select col1
from test_tabB b)

      COL1

----------

         1

1 row selected.


-- THEY MUST BE THE SAME!!! (or maybe not...)


SQL> -- insert a NULL to test_tabB

SQL> insert into test_tabB values (null)

1 row created.

SQL> commit

Commit complete.

SQL> -- Not exists query:

SQL> select * from test_tabA a
where not exists
(select 'x' from test_tabB b
where b.col1 = a.col1)


      COL1

----------

         1

1 row selected.

SQL> -- Not IN query:

SQL> select * from test_tabA a
where col1 not in
(select col1
from test_tabB b)

**no rows selected.**
于 2011-04-20T12:15:01.587 に答える
1

おそらく、ベン図を使用してクエリと結果を (手で) 描画し、それらが同じ図を生成するかどうかを確認できます。ベン図は一連のデータを表すのに適しており、SQL クエリは一連のデータに対して機能します。ベン図を描くと、2 つのクエリが機能的に同等かどうかを視覚化するのに役立つ場合があります。

于 2008-09-18T15:21:08.370 に答える
0

あなたはそうしない。

たとえば、パフォーマンスの変化がクエリの出力を変更していないという高いレベルの信頼性が必要な場合は、それをテストしてください。

非常に高いレベルの信頼性が必要な場合は、エラーを発生させて、さらにテストしてください。

大規模なレベルのテストは、SQLクエリのためにまとめるのはそれほど難しくありません。可能なパラメータの大規模/完全なセットを反復処理するprocを記述し、パラメータの各セットを使用して各クエリを呼び出し、出力をそれぞれのテーブルに書き込みます。2つのテーブルを比較すると、それがわかります。

それは正確には科学的ではなく、OPの質問だったと思いますが、同等性を証明するための形式手法を私は知りません。

于 2008-09-16T18:16:40.230 に答える