복붙노트

[SQL] ANSI는 대 비 ANSI 쿼리가 다르게 수행 가입 가입 할 것인가?

SQL

ANSI는 대 비 ANSI 쿼리가 다르게 수행 가입 가입 할 것인가?

나는 ~에 T-SQL 저장 프로 시저의 7000 선을 내 비즈니스 로직을 가지고 있으며 이들 대부분은 다음 구문을 가입하고있다 :

SELECT A.A, B.B, C.C
FROM aaa AS A, bbb AS B, ccc AS C
WHERE
    A.B = B.ID
AND B.C = C.ID
AND C.ID = @param

나는이와 같은 쿼리를 대체 할 경우 나는 성능의 성장을 얻을 것이다 :

SELECT A.A, B.B, C.C
FROM aaa AS A
JOIN bbb AS B
   ON A.B = B.ID
JOIN ccc AS C
   ON B.C = C.ID
   AND C.ID = @param

아니면은 동일?

해결법

  1. ==============================

    1.두 번째는 ANSI-92 SQL 구문이며, 첫 번째는 조인 절이 포함하지 않은 기존의 SQL 구문은 제외하고 두 쿼리는 동일합니다. 당신은 확인하실 수 있습니다하지만 그들은 정확히 동일한 내부에서 쿼리 계획을 생성한다.

    두 번째는 ANSI-92 SQL 구문이며, 첫 번째는 조인 절이 포함하지 않은 기존의 SQL 구문은 제외하고 두 쿼리는 동일합니다. 당신은 확인하실 수 있습니다하지만 그들은 정확히 동일한 내부에서 쿼리 계획을 생성한다.

    당신은 이유 중 몇 가지에 대한 ANSI-92 구문을 사용한다

    나 자신 나는 약간의 개념 장점은 그것의로 이전 구문에 존재하는 한 얼마 동안 ANSI-92에 저항 쉽게 질량은 필터링 작업을 다음에 사용되는 모든 테이블을 조인 직교 좌표로 SQL 직시하기 - 도움이 될 수있는 정신적 인 기술을 파악을 위해 무엇 SQL 쿼리하고있다. 주로하기 때문에 위의 첫 번째 이유 - 그러나 나는 시대와 함께 이동하고 비교적 짧은 조정 기간 후 지금 강력하게 선호 필요가 있다고 몇 년 전에 결정했다. 하나는 ANSI-92 구문에서 출발, 또는 오히려 옵션을 사용하지 않도록하는 유일한 장소는 자연의 내재적 위험있는 조인과 함께합니다.

  2. ==============================

    2.두 번째 구조는 SQL 커뮤니티에서 "참여 infixed 구문"로 알려져있다. AFAIK가 널리 이름이없는 첫 번째 구조는 그래서는 '올드 스타일'의 내부는 조인 구문을 호출 할 수 있습니다.

    두 번째 구조는 SQL 커뮤니티에서 "참여 infixed 구문"로 알려져있다. AFAIK가 널리 이름이없는 첫 번째 구조는 그래서는 '올드 스타일'의 내부는 조인 구문을 호출 할 수 있습니다.

    보통 인수는 다음과 같이 이동 :

    '전통'구문의 장점 다음 조건은 물리적으로 WHERE 절에 함께 그룹화됩니다 어떤 일반적으로 쿼리를 만드는 순서, 특히 n 차 관계, 쉽게 읽고 당신이 시각적 거리에 하나 개의 테이블 또는 컬럼의 모습을 찾아 할 수 있도록 조건을 확산 할 수 있습니다합니다 (infixed 구문의 ON 절을 이해하기 ).

    '전통적인'구문 단점 다음 "가입"조건 중 하나를 생략하고 결과 카티 제품 (A CROSS 알려진 infixed 구문 JOIN)에는 해석 에러가없고, 그러한 에러가 검출 까다로울 수 있고 디버그. 또한, 그들이 서로에 대해 혼동시킬 수있는 '필터링'술어 술어 물리적 WHERE 절에서 함께 그룹화를 '가입'.

  3. ==============================

    3.OK, 그들은 같은를 실행합니다. 즉 동의합니다. 많은과는 달리 나는 이전 규칙을 사용합니다. SQL-92는 "이해하기 쉽게"즉 논쟁의 여지가있다. 사십년 (꿀꺽) 나는 그 '읽기 쉬운'알을 밀어위한 프로그래밍 언어를 작성하는 데 (여기에 잘못 적용 기간하지만 내가 사용할 수있는 최고의 표현이다) '시력'으로, 다른 대회 전에 먼저 시작한다. SQL 제일 먼저 읽을 때 당신은 (대부분) 곡식을 정의하는 테이블 다음 테이블이 관련되어 무엇과에 대한 관심을 마음. 그런 다음 데이터에 관련 제약, 선택한 속성에 대한 관심. SQL-92은 대부분이 아이디어를 분리하는 동안, 너무 많은 노이즈 단어가, 마음의 눈으로 해석하고이 처리해야하고 그것은 SQL 느리게 읽고 있습니다.

    OK, 그들은 같은를 실행합니다. 즉 동의합니다. 많은과는 달리 나는 이전 규칙을 사용합니다. SQL-92는 "이해하기 쉽게"즉 논쟁의 여지가있다. 사십년 (꿀꺽) 나는 그 '읽기 쉬운'알을 밀어위한 프로그래밍 언어를 작성하는 데 (여기에 잘못 적용 기간하지만 내가 사용할 수있는 최고의 표현이다) '시력'으로, 다른 대회 전에 먼저 시작한다. SQL 제일 먼저 읽을 때 당신은 (대부분) 곡식을 정의하는 테이블 다음 테이블이 관련되어 무엇과에 대한 관심을 마음. 그런 다음 데이터에 관련 제약, 선택한 속성에 대한 관심. SQL-92은 대부분이 아이디어를 분리하는 동안, 너무 많은 노이즈 단어가, 마음의 눈으로 해석하고이 처리해야하고 그것은 SQL 느리게 읽고 있습니다.

    SELECT Mgt.attrib_a   AS attrib_a
          ,Sta.attrib_b   AS attrib_b
          ,Stb.attrib_c   AS attrib_c
    FROM   Main_Grain_Table  Mgt
          ,Surrounding_TabA  Sta
          ,Surrounding_tabB  Stb
    WHERE  Mgt.sta_join_col  = Sta.sta_join_col
    AND    Mgt.stb_join_col  = Stb.stb_join_col
    AND    Mgt.bus_logic_col = 'TIGHT'
    

    시력! 그것은 쉽게 너무 코드를 주석 만드는 앞에 새로운 속성의 쉼표를 넣어 기능과 키워드를 특정 케이스를 사용하여 테이블에 대한 특정 케이스를 사용하여 속성에 대한 특정 케이스를 사용하여 운영자 및 운영까지 수직 라인 필드에 첫 번째 테이블 (들)을 확인에서 데이터의 곡물을 나타냅니다 특정을 제약에 가입 할 수의 첫 번째 테이블을 꽉 제약은 바닥에 떠. 데이터베이스의 모든 테이블에 대한 3 자 별칭을 선택하고 테이블을 참조하는 모든 곳에서 별칭을 사용합니다. 당신은뿐만 아니라 그 테이블에 (많은) 인덱스에 대한 접두사로 그 별칭을 사용해야합니다. 또 다른 1 1/2 다스의 6, 맞죠? 아마도. 하지만 당신은 (내가 있고 경우에 할 것 같은) 당신이보고 싶은 곳으로 마음의 눈 AVERT을 수 있도록 정렬 verticle, 시력 원리를 사용하여 쉽게 특히 (일을 피하기 ANSI-92 규칙을 사용하는 경우에도 노이즈 단어) 당신은 할 필요가 없습니다.

  4. ==============================

    4.모두를 실행하고 자신의 쿼리 계획을 확인합니다. 그들은 동일해야합니다.

    모두를 실행하고 자신의 쿼리 계획을 확인합니다. 그들은 동일해야합니다.

  5. ==============================

    5.두 개의 질의가 동일 - 처음 사용하는 비 ANSI JOIN 구문을, 2는 ANSI JOIN 구문을한다. 나는 구문에 가입 ANSI 고수하는 것이 좋습니다.

    두 개의 질의가 동일 - 처음 사용하는 비 ANSI JOIN 구문을, 2는 ANSI JOIN 구문을한다. 나는 구문에 가입 ANSI 고수하는 것이 좋습니다.

    그리고 네, LEFT OUTER은 (BTW 또한 ANSI JOIN 구문을있는) 당신은 당신이 힘에 가입하고있는 테이블이되지 않은 일치하는 레코드를 포함 할 가능성이있을 때 사용하고 싶은 조인.

    참조 : 조건부은 SQL Server의 조인

  6. ==============================

    6.내가 작업 할 내 SELECT 절에 대한 행에 필요한 열을 결정 어디에 내 마음 속에서 FROM 절입니다. 비즈니스 규칙은 계산에 필요한 값은 동일한 행에 가져올 것이다 표현되는 곳이다. 비즈니스 규칙은 책임이있는 고객을 포함하여 송장의 행의 결과로, 청구서를 고객이 될 수 있습니다. 또한 함께 가까운 장소 및 클라이언트 목록의 결과로, 클라이언트와 동일한 우편 번호에 장소가 될 수 있습니다.

    내가 작업 할 내 SELECT 절에 대한 행에 필요한 열을 결정 어디에 내 마음 속에서 FROM 절입니다. 비즈니스 규칙은 계산에 필요한 값은 동일한 행에 가져올 것이다 표현되는 곳이다. 비즈니스 규칙은 책임이있는 고객을 포함하여 송장의 행의 결과로, 청구서를 고객이 될 수 있습니다. 또한 함께 가까운 장소 및 클라이언트 목록의 결과로, 클라이언트와 동일한 우편 번호에 장소가 될 수 있습니다.

    내 결과 집합의 행의 중심성을 해결하는 곳이다. 결국, 우리는 단순히의 RDBMS, 항목 (항목)과 엔티티의 인스턴스 인 각 행을 각각 갖는리스트 목록의 유를 나타낸다. 로우 중심적 이해되는 경우, 결과 세트의 엔티티가 이해된다.

    로우 후의 개념이 실행 FROM 절에 정의 된 WHERE 절은, 열이 필요하지 발췌 (또는 필요한 행 포함)의 작업에 대한 SELECT 절한다.

    논리가 모두 표현 될 수있다 가입하기 때문에 조항이 분할 및 정복 복잡한 논리에 존재하기 때문에 절과 FROM 절, 그리고, 그 본질적으로 사업을 표현하기 때문에 FROM 절에 열 값을 포함 논리에 가입 넣어 선택 컬럼의 값과 일치하는 규칙에 의해지지된다.

    즉, 나는이 같은 WHERE 절을 쓰지 않습니다 :

     WHERE Column1 = Column2
    

    이 같은 FROM 절에 그것을 넣어 것입니다 :

     ON Column1 = Column2
    

    나는 기본적으로 난 단지 원하는 말하고 있기 때문에 열이있는 경우 마찬가지로, 외부 값과 비교하는 등의 특정의 우편 번호에 우편 번호를 비교하는 등 (또는 열에하지 않을 수 있습니다 값), I는 WHERE 절에 그것을 넣어 것입니다 행이 맘에.

    즉, 나는이 같은 FROM 절을 쓰지 않습니다 :

     ON PostCode = '1234'
    

    나는이 같은 WHERE 절에 그것을 넣어 것입니다 :

     WHERE PostCode = '1234'
    
  7. ==============================

    7.ANSI 구문 적절한 절도 술어 배치를 적용하지 (하도록 ON 또는 WHERE)이나 인접 테이블 참조에 ON 절의 친화. 개발자는이 같은 혼란을 작성하는 무료

    ANSI 구문 적절한 절도 술어 배치를 적용하지 (하도록 ON 또는 WHERE)이나 인접 테이블 참조에 ON 절의 친화. 개발자는이 같은 혼란을 작성하는 무료

    SELECT
       C.FullName,
       C.CustomerCode,
       O.OrderDate,
       O.OrderTotal,
       OD.ExtendedShippingNotes
    FROM
       Customer C
       CROSS JOIN Order O
       INNER JOIN OrderDetail OD
          ON C.CustomerID = O.CustomerID
          AND C.CustomerStatus = 'Preferred'
          AND O.OrderTotal > 1000.0
    WHERE
       O.OrderID = OD.OrderID;
    

    이 발생하기 때문에 "ANSI-92을 생성합니다"쿼리 도구의 말하기, 내가 여기에 코멘트 해요

    SELECT 1
       FROM DEPARTMENTS C
            JOIN EMPLOYEES A
                 JOIN JOBS B
         ON C.DEPARTMENT_ID = A.DEPARTMENT_ID
         ON A.JOB_ID = B.JOB_ID
    

    기존의 탈출 유일한 구문은 "제한-프로젝트 직교 제품을"외부 조인입니다. 이 (자체 및 가입 정상 모두와) 연관되지 않기 때문에이 작업은 더 복잡하다. 외부 조인과 함께 하나는 적어도 신중하게 쿼리를 괄호로해야합니다. 그러나, 이국적인 작업이다; 당신이 너무 그것을 사용하는 경우 자주 관계형 데이터베이스 클래스를 복용하는 것이 좋습니다.

  8. from https://stackoverflow.com/questions/1599050/will-ansi-join-vs-non-ansi-join-queries-perform-differently by cc-by-sa and MIT license