두 SQL 문의 수학적 평등


9

두 SQL 문의 수학적 동등성을 확인하는 방법이 있습니까?

두 개의 SQL 문이 있습니다.

  • SQL_STATEMENT_1
  • SQL_STATEMENT_2

데이터에 대해 두 명령문을 모두 실행하고 출력을 비교해도 전혀 도움이되지 않습니다.

계산식 솔버와 마찬가지로 명령문 뒤에 설정된 수학을 평가해야합니다.

내 질문의 범위를 벗어난 것은 다음과 같습니다.

  • 평등 이외의 비교 (LIKE보다 크거나 작음, ...)
  • 저장 프로 시저 또는 트리거
  • 공통 테이블 표현식 (WITH)

범위에서 :

  • 하위 선택 : WHERE other_id IN (다른 WHERE에서 ID 선택)
  • 조인

부분 솔루션은 두 쿼리의 실행 계획을 비교하는 것입니다. 실행 계획이 동일하면 동일합니다. 그러나 관계는 두 가지 방식으로 작동하지 않습니다. 실행 계획이 다른 논리적으로 동등한 쿼리가 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 파일이 있습니다. 매개 변수는 XML 파일에서 <ParameterList> 노드로 포함되었습니다. 시각적으로 이러한 계획은 동일합니다 (테이블 스캔 + 선택). 그러나 나는 당신이 실행 계획을 비교하는 것이 옳을 것이라고 생각합니다.
BuahahaXD

1
고유 키와 관련하여 @a_horse_with_no_name이 정확합니다. 모든 다른 사람들을 위해, 그것은 가능 select * from foo where id = 4하고 select * from foo where id = 21) 인덱스 통계가 최신의 2없는 경우 인덱스 통계가 최신 경우에도) 두 개의 서로 다른 실행 계획을 가지고, ID의 키 분배가 한쪽으로 기운 제공된 ID는 고유 키가 아닙니다.
RolandoMySQLDBA

답변:


6

두 SQL 문의 수학적 평등은 무엇입니까? 나에게 두 개의 쿼리는 동일한 데이터 세트가 모두 주어지면 동일한 결과 세트를 반환하는 경우 동등합니다.

지적했듯이 관계형 대수 의 상위 집합 인 SQL 쿼리 는 매우 복잡 할 수 있습니다. 하위 쿼리를 혼합하고 저장 프로 시저와 함수 ( 결정적 이든 아니든)를 사용하여 쿼리를 실제 코드 처럼 보이게 할 수 있습니다 . 이런 종류의 쿼리에 대해 이야기한다면 정말 어려울 것입니다. 실제로 "두 알고리즘이 동일합니다"문제와 다르지 않습니다.

그러한 상황에서는 아마도 불가능할 것입니다.

하나...

... 비교하려는 두 쿼리가 엄격한 설정 작업 인 경우 실행 가능할 있습니다. 그렇다면 쿼리를 관계형 대수로 변환 한 다음 동등성 규칙에 따라 해결하십시오 . 사소한 부울 조건을 사용하여 선택 / 제한하는 경우 해당 조건과 동등한 것보다 증명해야 할 수도 있습니다. 그런 다음 부울 대수 에 의존해야하며 아마도 진리표를 수행하게 될 것입니다 .

보시다시피, 이것은 많은 작업이 될 것이며, 내가 아는 한, 그 모든 것을 자동으로 계산하는 것은 없습니다. 그럼에도 불구하고 작업을 수행하려는 경우 유용한 도구를 찾았습니다.


내 질문은 집합 작업에 관한 것입니다. 질문을 업데이트했습니다. "두 알고리즘이 동일합니다"문제와 관련이 있습니다. 그러나 컨텍스트는 제한적이며 집합, 조인, 하위 선택의 기본 작업 만 내 범위에 있습니다.
guettli

3

정의에 따라 유한 시간 내에 의미 론적 동등성을 검사하는 것은 불가능합니다. 라이스 정리를 참조하십시오 .

부분 함수의 사소한 속성에 대해 알고리즘이 해당 속성으로 부분 함수를 계산하는지 여부를 결정하는 일반적이고 효과적인 방법은 없습니다.


2
이것은 단지 주석이 아닙니다. 쌀의 적용 가능성을 이러한 맥락으로 확장 할 수 있습니까?
Michael Green

이론적으로는 가능하지만 현재의 SQL 표준 구문은 바로크이므로 실제로는 불가능합니다
James Anderson

1
OP 설명에서는 의미 상 동등성보다 논리적 동등성에 대한 질문이 더 많은 것처럼 보입니다. 실제 질문은 다음과 같습니다. SQL 문을 수학 표현식으로 변환 한 다음 논리적 동등성을 평가할 수 있습니까?
ForguesR

2

dba 사용자 Lennart 가이 프로젝트를 지적했습니다.

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

Cosette는 SQL 쿼리의 동등성을 확인하기위한 자동화 된 프로 버입니다. Coq Proof Assistant와 Rosette 기호 가상 머신에서 SQL의 상당 부분을 공식화합니다. 주어진 쿼리 쌍에 대한 공식적인 동등 증명 또는 반례를 리턴합니다.


1

이를 수행하는 한 가지 방법은 구문 분석기를 작성하거나 기존 구문 분석기를 사용하는 것입니다. C #에는 TSQLParser 클래스가 있고 Parse () 메서드가 있다고 생각합니다. 파서는 쿼리를 하위 클래스로 나눈 다음 비교할 수 있습니다.


1

이론 설정 기반 동등성 검정을 찾는 경우 가장 좋은 방법은 (내부 또는 외부) WHERE유형으로 변환 할 수있는 조건 을 변환 JOIN하고 명령문을 리팩토링하는 것입니다. 여기에는 IN subselectEXISTS subselect의 다른 조건 WHERE단어를 포함 절을 SELECT. 두 SQL 문에서이 작업을 수행하면 FROM원하는 세트 기반 논리 / 수학을 나타내는 새로운 절이 생깁니다. 그러면 두 명령문을 시각적으로 비교할 수 있습니다. 이 모든 것을 자동으로 수행하는 방법을 찾고 있다면 정확히이 작업을 수행 할 수있는 도구를 모르겠습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.