나는 며칠 전에 SQL 최적화 후에 이것을 생각하고있었습니다. 우리는 SQL이 위키 백과의 정의에서 "선언적 언어"라는 것에 동의 할 수 있다고 생각합니다.
제어 흐름을 설명하지 않고 계산 논리를 표현하는 프로그래밍 패러다임
커튼 뒤에서 얼마나 많은 일들이 (통계를 보거나, 인덱스가 유용한 지 결정하고, 중첩, 병합 또는 해시 조인 등을 결정하는 등) 생각하는 경우, 우리는 단지 높은 수준을 제공한다는 것을 인정해야합니다 데이터베이스는 모든 하위 수준 제어 흐름 논리를 처리했습니다.
또한이 시나리오에서 때때로 데이터베이스 최적화 프로그램은 최상의 결과를 제공하기 위해 사용자의 "힌트"가 필요합니다.
"선언적"언어에 대한 또 다른 일반적인 정의는 다음과 같습니다.
원하는 계산 결과를 표현하는 단계를 설명하지 않고 원하는 계산 결과를 표현하는 프로그래밍 패러다임 ( "방법 설명, 방법 설명"으로 축약 됨)
이 정의를 수락하면 OP에 설명 된 문제가 발생합니다.
첫 번째 문제는 SQL이 "동일한 결과"를 정의하는 여러 가지 동등한 방법을 제공한다는 것입니다. 아마도 그것은 악한 것입니다. 언어에 표현력이 강할수록 같은 표현을 할 수있는 다른 방법이 더 많이있을 것입니다.
예를 들어,이 쿼리를 최적화하라는 요청을 한 번 받았습니다.
SELECT Distinct CT.cust_type, ct.cust_type_description
from customer c
INNER JOIN
Customer_type CT on c.cust_type=ct.cust_type;
유형이 고객보다 훨씬 적고 cust_type
고객 테이블에 색인 이 있었으므로 다음과 같이 다시 작성하여 크게 개선했습니다.
SELECT CT.cust_type, ct.cust_type_description
from Customer_type CT
Where exists ( select 1 from customer c
Where c.cust_type=ct.cust_type);
이 특정 사례에서 개발자에게 달성하고자하는 것을 물었을 때 "최소한 한 명의 고객을 보유한 모든 고객 유형을 원했습니다"라고 말하면서 우연히 옵티 마이저 쿼리를 설명 할 수있는 방법입니다.
따라서 동등하고 더 효율적인 쿼리를 찾을 수 있다면 옵티마이 저가 왜 그렇게 할 수 없습니까?
가장 좋은 추측은 두 가지 주요 이유 때문입니다.
SQL은 논리를 표현합니다 :
SQL이 높은 수준의 논리를 표현하기 때문에 옵티마이 저가 우리와 우리의 논리를 "우수하게"원할까요? 나는 항상 최적화 프로그램이 가장 효율적인 실행 경로를 선택하도록 강요하지 않았다면 열정적으로 "예"를 외칠 것이다. 나는 그 아이디어가 옵티마이 저가 최선을 다할 수 있도록하는 것이지만 (논리를 수정하는 것) 무언가가 미쳤을 때 구조에 올 수있는 "힌트 메커니즘"을 제공 할 수 있다고 생각한다 (바퀴와 브레이크가 자율 주행 차).
더 많은 선택 = 더 많은 시간
최고의 RDBMS 옵티 마이저조차도 가능한 모든 실행 경로를 테스트하지는 않습니다. 실제로 빠르지 않아야합니다. 100ms마다 최고의 경로를 선택해야 할 때마다 100ms에서 10ms까지 쿼리를 최적화하는 것이 얼마나 좋을까요? 그리고 그것은 "고수준 논리"를 존중하는 옵티 마이저와 함께합니다. 동등한 SQL 조회도 모두 테스트해야하는 경우 최적화 시간이 여러 번 증가 할 수 있습니다.
RDBMS가 실제로 할 수없는 쿼리 재 작성의 또 다른 좋은 예는 ( 이 흥미로운 블로그 게시물에서 )
SELECT t1.id, t1.value, SUM(t2.value)
FROM mytable t1
JOIN mytable t2
ON t2.id <= t1.id
GROUP BY t1.id, t1.value;
이처럼 쓸 수있는 것 (분석 기능 필요)
SELECT id, value, SUM(t1.value) OVER (ORDER BY id)
FROM mytable
select whatever from sometable where FKValue in (select FKValue from sometable_2 where other_value = :param)
.exists
또는로 로 다시 설명하는 방법을 이해하는 것은 쉽지 않습니다join
.