programing

뭐가 더 좋습니까?하위 쿼리 또는 내부 접합 10개 테이블?

oldcodes 2023. 6. 23. 22:26
반응형

뭐가 더 좋습니까?하위 쿼리 또는 내부 접합 10개 테이블?

몇 가지 변경과 수정을 위해 오래된 시스템이 사무실에 도착했지만 성능 문제로 인해 어려움을 겪고 있습니다.우리는 이 속도 저하의 원인이 무엇인지 정확히 알지 못합니다.

이전 코드를 리팩터링하는 동안 다음과 같은 패턴을 가진 여러 SQL 쿼리를 발견했습니다(쿼리는 예를 들어 단순화됨)

SELECT
   (
    SELECT X
    FROM A
    WHERE A.id = TABLE.id
   ) AS COLUMN1,
    (
    SELECT Y
    FROM B
    WHERE B.id = TABLE.id
   ) AS COLUMN1,
   (
    SELECT Z
    FROM C
    WHERE C.id = TABLE.id
   ) AS COLUMN1,
   ...
FROM
    TABLE
WHERE
    TABLE.id = @param;

이러한 쿼리는 반환되는 모든 열에서 여러 내부 하위 쿼리를 수행합니다.

우리는 다음과 같은 패턴으로 이러한 쿼리를 다시 작성할 계획입니다.

SELECT
    A.X, B.Y, C.Z
FROM
    TABLE
    INNER JOIN A on A.ID = TABLE.ID
    INNER JOIN B on B.ID = TABLE.ID
    INNER JOIN C on C.ID = TABLE.ID
WHERE
    TABLE.id = @param;

내면의 결합으로 그들은 읽고 이해하기가 더 쉽지만, 그것이 정말로 더 빠릅니까?그것이 그것들을 쓰는 더 나은 방법입니까?안타깝게도 처음에 다시 쓴 것은 쿼리 시간을 향상시키지 못했고 쿼리 속도를 약간 늦췄습니다.

여기 제 질문이 있습니다: 우리가 이 모든 질문을 다시 작성해야 할까요?이 하위 질의들이 이 일을 하는 좋은 방법입니까?그들이 내부 결합 방식이 더 빠릅니까?

내가 당신의 질문을 올바르게 이해했다면, 당신은 SQL 문에 문제가 있을 수 있다고 생각하기 때문에 일부 SQL 문을 다시 쓰는 작업을 시작하는 것입니다.

저의 조언은 여러분의 시간이 현재 어디에 사용되고 있는지를 결정하는 것을 멈추고 먼저 시작하라는 것입니다.해당 스칼라 하위 선택 항목이 있는 쿼리에 있는 경우에만 해당 스칼라 하위 선택 항목 때문에 해당 항목을 다시 작성해야 합니다.그때까지: 추적 및 검사를 시작합니다.

성능 문제가 있는 사용자를 안내하는 데 사용되는 OTN의 두 가지 스레드는 다음과 같습니다.

http://forums.oracle.com/forums/thread.jspa?messageID=1812597 http://forums.oracle.com/forums/thread.jspa?threadID=863295

안부 전해요,

또한 스칼라 하위 쿼리 캐싱 때문에 원래 쿼리가 조인을 사용하여 다시 작성된 쿼리보다 훨씬 빠를 수 있습니다.

하위 쿼리는 실제로 모든 행에 대해 한 번 실행되는 반면 조인은 인덱스에서 발생합니다.

질문에서 이미 언급한 것처럼 보다 나은 가독성과 유지관리성을 위해 조인을 사용합니다.

조인을 하면 성능이 향상되지만, "최적화" 쿼리를 실행할 때마다 실행 계획을 검토하는 것이 좋습니다.

이 답변이 주장하는 바와 같이 성능에 영향을 미치지 않아야 합니다.그러나 일부 쿼리 최적화 프로그램은 JOIN에서 더 잘 수행될 수 있으므로 시스템에서 몇 가지 실험을 수행해야 합니다.

이제 다른 것을 : 그고이제완다전른것위을해히리위::JOIN의 테이블을 이 각테블을다테음이이동것는하이있수다더습니미적일로블이보다 더 미적일 수 있습니다.JOIN 것을 포함하여TABLE테이블 중 하나에 ID가 두 번 이상 나타날 때마다 오류를 방지합니다.

SELECT
    A.X, B.Y, C.Z
FROM
    TABLE
    INNER JOIN A on A.ID = TABLE.ID
    INNER JOIN B on A.ID = B.ID
    INNER JOIN C on B.ID = C.ID
WHERE
    TABLE.id = @param;

여기 안쪽 접합이 더 좋습니다.그 이유는 다음과 같습니다.

1 - 기본 쿼리에서 하위 쿼리에 사용된 표의 값을 참조/사용하고 있습니다.조인은 이를 위한 것입니다."하나의 테이블에서는 값을 얻을 수 없으므로 다른 테이블을 결합하여 값을 얻습니다."라는 질문이 있습니다.

하위 쿼리의 열이 기본 쿼리에서 참조되지 않는 경우 하위 쿼리를 사용해야 합니다.예:

select * from emp where deptno in ( select deptno from dept ); 

여기서 당신은 "부서 번호 부서에서 일하는 모든 직원들을 불러주세요."라고 묻고 있습니다.당신은 이 뎁트노에 대해 크게 걱정하지 않습니다.

2- 또 다른 이유는 이미 언급한 가독성입니다.

3 - 성능 측면에서는 Optimizer가 무엇을 해야 하는지 알고 있으므로 걱정할 필요가 없습니다.

자세한 내용은 여기를 참조하십시오.

언급URL : https://stackoverflow.com/questions/4921227/what-is-better-subqueries-or-inner-joining-ten-tables

반응형