2012-11-15 3 views
2

저는 기존 Oracle 데이터베이스를 사용하고 있습니다 (구성하지 않았고 테이블 구조를 넘어서 아무것도 알지 못합니다). 일부 쿼리는 매우 빠르며 다른 유사한 쿼리는 매우 느립니다. 예를SQL 쿼리 시간을 이해하십시오.

SELECT a.price, c.banner_id, c.short_name 
FROM ret_price_current a 
    JOIN ret_store b ON a.store_id = b.store_id 
    JOIN ret_banner c ON b.banner_id = c.banner_id 
    JOIN ret_store2cbsa_csa d ON a.store_id = d.store_id 
WHERE rownum<3 

(1.09, 74, 'Safeway') 
(1.09, 74, 'Safeway') 
that took 0.243073940277 seconds 

들어 있지만 조건이 WHERE 겉으로는 단순 추가하는 경우 : 지금 많은 분 동안 돌아 가지 않고

SELECT a.price, c.banner_id, c.short_name 
FROM ret_price_current a 
    JOIN ret_store b ON a.store_id = b.store_id 
    JOIN ret_banner c ON b.banner_id = c.banner_id 
    JOIN ret_store2cbsa_csa d ON a.store_id = d.store_id 
WHERE c.banner_id = 74 
    AND rownum<3 

가 실행되었습니다. 무슨 일 이니? (참고로, ret_price_current는 ~ 300m 엔트리를 가지고 있고 다른 것들은 훨씬 더 작습니다.) 인덱스와 관련이 있다고 상상해보십시오. 누군가가 저에게 데이터베이스 알고리즘에 관한 책을 가르쳐 줄 수 있습니까 (예 : 쿼리가 실제로 백엔드에서 작동하는 방식). 무슨 일이 벌어지고 있는지 이해할 수 있니?

+1

아마도 banner_id에 대한 색인이나 banner_id 및 rownum에 대한 색인이 필요할 것입니다. rownum 필드가있는 테이블은 무엇입니까? –

+2

rownum은 단순히 oracle에게 첫 번째 n 개의 행만 반환하도록 알려줍니다. – andyInCambridge

+0

c.banner_id = 74가 세 번째 조인보다 느린 이유는 없습니다. b.banner_id = 74는 어떻게됩니까? –

답변

2

이유는 ROWNUM이 출력 될 때 행에 생성된다는 것입니다.

첫 번째 쿼리에는 critera가 없으므로 첫 번째 행에 3 개의 행이 나오고 완료됩니다. 꽤 빨리 일치하는 3 개의 행을 찾을 수 있습니다.

초가 멈출 수 있기 전에 조건에 맞는 3 개의 행을 찾아야합니다 (3 행을 찾지 못할 수도 있음).

쿼리가 완전히 다르므로 실행할 시간이 다릅니다.

이 실행 속도를 높이려면 c.banner_id (사실 모든 FK)를 인덱싱하는 것이 좋습니다.

oops - 다른 답변으로 타임 스탬프에 주목했습니다. 나는 어쨌든이 질문을 답장으로 남겨두고 의견 중 하나는 여기에 남겨 둘 것입니다.

+0

+1 질문 타임 스탬프는 걱정하지 마십시오. 최근에 모든 종류의 질문이 편집으로 부활되었습니다. –

관련 문제