JOIN의 ON 절에서 참조되는 테이블의 순서가 중요합니까?
JOIN에 대한 ON 조항의 기준을 어느 방법으로 주문하는지는 문제가 되지 않습니까?
select a.Name, b.Status from a
inner join b
on a.StatusID = b.ID
대
select a.Name, b.Status from a
inner join b
on b.ID = a.StatusID
퍼포먼스에 영향이 있습니까?만약 내가 여러 기준을 가지고 있다면?
하나의 주문이 다른 주문보다 유지보수가 더 쉽습니까?
JOIN테이블을 올바른 순서로 배치함으로써 순서를 강제할 수 있습니다.FROM절:
MySQL에는 다음과 같은 특별한 조항이 있습니다.
STRAIGHT_JOIN순서가 중요하죠.이것은 다음에 인덱스를 사용합니다.
b.id:SELECT a.Name, b.Status FROM a STRAIGHT_JOIN b ON b.ID = a.StatusID그리고 이것은 에 대한 인덱스를 사용할 것이다.
a.StatusID:SELECT a.Name, b.Status FROM b STRAIGHT_JOIN a ON b.ID = a.StatusIDOracle에는 특별한 힌트가 있습니다.
ORDERED강제하다JOIN주문:이것은 다음에 인덱스를 사용합니다.
b.id또는 해시 테이블을 만듭니다.b:SELECT /*+ ORDERED */ * FROM a JOIN b ON b.ID = a.StatusID그리고 이것은 에 대한 인덱스를 사용할 것이다.
a.StatusID또는 해시 테이블을 만듭니다.a:SELECT /*+ ORDERED */ * FROM b JOIN a ON b.ID = a.StatusIDSQL Server에는 다음과 같은 힌트가 있습니다.
FORCE ORDER동일한 작업을 수행할 수 있습니다.이것은 다음에 인덱스를 사용합니다.
b.id또는 해시 테이블을 만듭니다.b:SELECT * FROM a JOIN b ON b.ID = a.StatusID OPTION (FORCE ORDER)그리고 이것은 에 대한 인덱스를 사용할 것이다.
a.StatusID또는 해시 테이블을 만듭니다.a:SELECT * FROM b JOIN a ON b.ID = a.StatusID OPTION (FORCE ORDER)PostgreSQL 여러분, 죄송합니다.하기 위해서 목록에는 다음과 같은 내용이 있습니다.
옵티마이저 힌트(불필요)
옵티마이저 힌트는 옵티마이저의 문제를 회피하기 위해 사용됩니다.우리는 차라리 문제를 보고하고 수정해 주길 바란다.
비교 순서는 어느 쪽이든 상관없습니다.RDBMS, AFAIK.
저는 개인적으로 항상 어떤 컬럼을 검색할지 예측하고 이 컬럼을 왼쪽에 놓으려고 노력하지만lvalue).
자세한 내용은 이 답변을 참조하십시오.
아니, 그렇지 않아.
(가독성을 위해) 제가 하는 일은 두 번째 예시입니다.
아니요. 데이터베이스는 각 항목을 순서대로 보고 작성하는 것이 아니라 전체 기준에 따라 최적의 실행 계획을 결정해야 합니다.두 쿼리의 실행 계획을 요청하면 동일한 쿼리를 확인할 수 있습니다(같은 로직을 궁극적으로 지정하는 한 매우 다른 쿼리도 종종 동일한 실행 계획으로 컴파일됩니다).
아니, 없어.결국 a=b인지 아닌지를 평가하게 됩니다.
그리고 평등의 대칭적 특성으로서:
- a와 b의 양에 대해 a = b이면 b = a이다.
그래서 당신이 확인하든 말든(12)*=12또는12=(12)*논리적으로 차이가 없습니다.
값이 같으면 결합하고 같지 않으면 결합하지 마십시오.첫 번째 예시와 같이 지정하든 두 번째 예시와 같이 지정하든 아무런 차이가 없습니다.
많은 사람들이 말하듯이:순서에 따라 결과나 퍼포먼스가 달라지는 것은 아닙니다.
제가 지적하고 싶은 것은 LINQ to SQL은 첫 번째 케이스만 허용한다는 것입니다.
예를 들어, 다음 예제는 잘 작동합니다.
var result = from a in db.a
join b in db.b on a.StatusID equals b.ID
select new { Name = a.Name, Status = b.Status }
...이렇게 하면 Visual Studio에 오류가 발생합니다.
var result = from a in db.a
join b in db.b on b.ID equals a.StatusID
select new { Name = a.Name, Status = b.Status }
이로 인해 다음 컴파일러 오류가 발생합니다.
- CS1937: 이름 'name'은 'equals' 왼쪽에 없습니다.'equals'의 양쪽에 있는 식을 교환해 보십시오.
- CS1938: 이름 'name'은 'equals' 우측에 포함되지 않습니다.'equals'의 양쪽에 있는 식을 교환해 보십시오.
표준 SQL 코딩에는 관련이 없지만 어느 하나에 익숙해질 때 고려해야 할 사항일 수 있습니다.
SqlServer에는 이보다 훨씬 복잡한 상황에 대한 최적화가 포함되어 있습니다.
기준을 여러 개 가지고 있는 경우, 일반적으로는 게으른 평가를 받습니다(단, 엣지 케이스가 있는 경우는 조금 조사할 필요가 있습니다).
가독성을 위해 저는 보통
SELECT Name, Status FROM a
JOIN b
ON a.StatusID = b.ID
변수를 선언된 순서대로 참조하는 것이 더 낫다고 생각합니다만, 이것은 정말로 개인적인 취향입니다.
두 번째 사례를 사용하지 않는 유일한 이유는 다음과 같습니다.
select a.Name, b.Status
from a
inner join b
on b.ID = a.StatusID
경우 사용자가 ' b.볼 수 을 볼 수 말할 이 높기 에, 이 를 미리 'a.'을 사용합니다.라고 말할 가능성이 높기 때문에 이 예를 미리 계획해 두겠습니다.On a.StatusID = b.IDLEFT Outer Join(왼쪽 외부 결합)입니다.이것은 'b'가 없는 표 'a' 레코드를 가질 수 있다고 가정합니다.
수정:결과가 달라지진 않을 거야.
사용자가 요구 사항을 변경하기를 원하지 않기 때문에 이 점은 문제가 될 수 있습니다.
아뇨, 상관없어요(적어도 나에게는) 당신의 질문을 읽기 쉽게 하기 위한 예를 소개합니다.
select a.*, b.*
from tableA a
inner join tableB b
on a.name=b.name
and a.type=b.type
각 테이블 참조는 다른 행에 있고 각 조인 기준은 다른 행에 있습니다.탭은 어떤 것에 속하는지 바로 잡아주는 데 도움이 됩니다.
제가 좋아하는 또 다른 것은 제 진술서의 기준을 표와 같은 순서로 만드는 것입니다.따라서 a가 처음이고 b가 처음이면 a는 왼쪽에, b는 오른쪽에 있습니다.
오류: ON 절이 오른쪽 테이블을 참조합니다(php sqlite 3.2).
이것을 치환하다
LEFT JOIN itm08 i8 ON i8.id= **cdd01.idcmdds** and i8.itm like '%ormit%'
LEFT JOIN **comodidades cdd01** ON cdd01.id_registro = u.id_registro
이 때문에
LEFT JOIN **comodidades cdd01** ON cdd01.id_registro = u.id_registro
LEFT JOIN itm08 i8 ON i8.id= **cdd01.idcmdds** and i8.itm like '%ormit%'
언급URL : https://stackoverflow.com/questions/785583/does-the-order-of-tables-referenced-in-the-on-clause-of-the-join-matter
'programing' 카테고리의 다른 글
| WooCommerce 계정 등록 메일에서 사용자 이름에 액세스합니다(독일어로 WooCommerce를 통한 DOI). (0) | 2023.04.04 |
|---|---|
| _reactDom2.default.render는 함수가 아닙니다. (0) | 2023.04.04 |
| Get_posts는 X일 이내 - Wordpress (0) | 2023.04.04 |
| 오라클 SQL 테이블의 날짜 업데이트 (0) | 2023.04.04 |
| $rootScope를 사용하는 이유는 무엇입니까?AngularJS로 $broadcast? (0) | 2023.04.04 |