2017-12-18 17 views
-1

쿼리 1 :Postgresql 다른 쿼리 이유는 무엇입니까?

select c_bh,c_xzdm,c_twhbm,d_tjrq 
from (
    select c_bh,c_xzdm,c_twhbm,d_tjrq 
    from t_table 
    order by d_tjrq desc 
) t1 
limit 10 

쿼리 2

select c_bh,c_xzdm,c_twhbm,d_tjrq 
from t_table 
order by d_tjrq desc 
limit 10 

동일한 계획 :이 최적화 될 수 있도록 첫 번째 경우

Limit (cost=0.44..18.79 rows=10 width=59) 
    -> Index Scan using i_t_table_d_tjrq on t_table (cost=0.44..32135085.58 rows=17507700 width=59) 
+0

query (2)의 출력은 query (1)의 유효한 출력이며 반대는 사실이 아니므로 PostgreSQL은 (2)와 동일한 출력을 줄 수 있으므로 동일한 실행을 선택할 수 있습니다 계획. –

+0

물론 그들은 같은 일을하고 있기 때문에 같은 계획을 사용합니다. –

+1

SQL은 *** 선언적 ***이 아닌 *** 명령 ***입니다. 이것은 SQL이 실행되지 않는다는 것을 의미합니다. 문제 공간을 표현할 수있는 언어입니다. 데이터베이스 엔진은 문제를 선언하여 계획을 생성합니다. * (일반적으로 비용 추정을 사용하여 해결 방법을 선택합니다.) * . 귀하의 예제에서 두 SQL 문은 같은 문제에 해당하므로 동일한 방법으로 해결할 수 있습니다. – MatBailie

답변

0

는 PostgreSQL의 “는 서브 쿼리 ” 평탄화 보다 나은. 결과는 두 번째 쿼리와 동일합니다.

이 문제를 방지하려면 같은 최적화 장벽을 OFFSET 0과 같이 하위 쿼리에 넣습니다.