2012-11-09 3 views
2

이 질문은 MySQL에만 적용되지만이 대답이 일반적으로 SQL 엔진에 적용되는지는 알 수 없습니다.MySQL 쿼리 효율성 제안

또한 구문 쿼리가 아니기 때문에 간결성/명확성을 위해 psuedo-SQL을 사용하고 있습니다.

C [1] .. C [M]은 (AND 또는 OR로 분리 된) 기준 집합이며 Q [1] .. Q [N]은 다른 집합 (OR로 구분)입니다. C [1] ... C [M]을 사용하여 테이블을 필터링하고이 필터링 된 테이블에서 Q [1] ... Q [N]과 일치하는 모든 행을 원합니다.

내가 할 것 인 경우 : C [1] ... C [M]을 한 번만 발견되는 각각의 Q는 [I]이 캐시에 대해 실행되도록

SELECT ... FROM ... WHERE (C[1]...C[M]) AND (Q[1]...Q[N]) 

이 자동으로 최적화 할 것인가 에드 결과? 그렇지 않은 경우, 나는 다음과 같이 두 가지로 쿼리를 분리해야합니다

INSERT INTO TEMP ... SELECT ... FROM ... WHERE C[1]...C[N] 
SELECT ... FROM TEMP WHERE Q[1]...Q[N] 
+2

,이 질문은 너무 광범위 조금입니다 : 조회, 스키마의 특성이와 RDBMS는 모두 대답에 영향을줍니다. 인덱스를 사용할 수있는 절의 부울 단순화 및 우선 순위 지정을 제외하고 현재 버전의 MySQL에서는 옵티 마이저가 나머지 절을 게으른 평가를 위해 불확정한 순서로 선택한다고 생각합니다. 다른 쿼리를 통해 임시 테이블이 아닌 하위 쿼리의 구체화 된 테이블을 사용할 수도 있지만 다른 테이블을 통하지 않고 영향을 줄 수있는 방법이 있다고 생각하지 않습니다. – eggyal

답변

0

이이 필터에 따라 조인 컴파일하기위한 최선의 순서를 계산하기 위해 내부 쿼리 최적화의 일이다. 의 예를 들어

:

SELECT * 
FROM 
    table1 
     INNER JOIN table2 ON table1.id = table2.id AND table2.column = Y 
     INNER JOIN table3 ON table3.id2 = table2.id2 AND table3.column = Z 
WHERE 
    table1.column = X 

MySQL을 (/ 오라클/SQLSERVER 등) 최고의 성능을 제공하기 위해 각 중간 결과 집합을 미리 계산하는을 시도 할 것이고, 실제로 여기에 엔진이를하고있다 꽤 잘 했어.

그러나 모든 것은 실제로 아키텍처에서 설정 한 테이블과 인덱스에 대한 통계에 의존합니다. 데이터를 표로 채우는 것과 별개로이 2 가지 포인트가 옵티마이 저가 올바른 정보를 제공함으로써 올바른 의사 결정을 내릴 수 있도록 영향을 줄 수있는 유일한 요소입니다.

도움이 되었기를 바랍니다.

ps : 이것 좀보세요. 이것은 오라클에서 쿼리 컴파일에서 우선 순위의 연산자와 순서에 대해 아직 아마 어쨌든 알 수있는 좋은 일이 :

슬프게도 http://ezinearticles.com/?Oracle-SQL---The-Importance-of-Order-of-Precedence&id=1597846

+0

알았 으면 링크를 확인하십시오. 모든 응답을 주셔서 감사합니다. 긴 이야기가 짧은 것 같습니다. 나는 안전하게 플레이하고 중간 테이블을 만들어서 상황이 내가 원하는 방식으로 "캐시"되어 있는지 확인해야합니다. – RonaldBarzell

+0

정말, 정말로해야한다고 생각하지 않아요. 당신이해야 할 일은 당신의 비즈니스와 일치하는 DDL을 구축하고, 당신이하고 싶은 쿼리에 따라 그것을 구체화하는 것입니다. 검색어는 모델과 일치하지 않아야하지만 그 반대입니다. – Sebas

+0

감사합니다. 나는 그런 일을하고있다. 아직 테이블을 구조화하지는 않았지만, 예상 한 쿼리에서 거꾸로 작업하고 있습니다 (표준화의 제약 조건 내에서) 그에 따라 테이블을 구조화하려고 노력하고 있습니다. 그러나, (My) SQL이 일을 최적화하는 방법을 거의 알지 못하기 때문에 "쿼리 최적화"는 주로 내 쿼리를 효율적으로 이해하는 것보다 쉽게 ​​이해하는 데 중점을 둡니다. – RonaldBarzell