복붙노트

[SQL] A는 빠르게 WHERE 이상의 조인?

SQL

A는 빠르게 WHERE 이상의 조인?

내가 연결되어있는 두 개의 테이블 (하나는 다른 외국의 키가) 있다고 가정 해 봅시다 :

CREATE TABLE Document (
  Id INT PRIMARY KEY,
  Name VARCHAR 255
)

CREATE TABLE DocumentStats (
  Id INT PRIMARY KEY,
  DocumentId INT, -- this is a foreign key to table Document
  NbViews INT
)

나는이 일을하는 가장 현명한 방법이 아니다 알고 있지만, 내가 가지고 올 수있는 가장 좋은 예입니다.

지금, 나는 500 개 이상의 전망을 모든 문서를 얻을합니다. 내 마음에 와서 두 솔루션은 다음과 같습니다 :

SELECT *
FROM Document, DocumentStats
WHERE DocumentStats.Id = Document.Id
  AND DocumentStats.NbViews > 500

나 :

SELECT *
FROM Document
INNER JOIN DocumentStats
ON Document.Id = DocumentStats.Id
WHERE DocumentStats.NbViews > 500

두 쿼리는 동등, 또는 훨씬 더 다른 것보다 하나의 방법은 무엇입니까? 그렇다면, 왜?

내 예를 들어이 완벽하게되지 않는다는 것을 알고 있어요, 그리고 쿼리는 약간의 튠업을해야 할 수도 있습니다,하지만 난 당신이 점을 얻었기를 바랍니다;)!

편집은 (... 등 MySQL은,)에 대한 답변에서 요청한대로,이 질문은 MSSQL을 목표로하고 있지만, 다른 DB 엔진 다른 경우 내가 아는에 관심이있을 것

해결법

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

    1.이론적으로, 아니, 그것은 빨리해서는 안됩니다. 쿼리 최적화 프로그램은 동일한 실행 계획을 생성 할 수 있어야한다. 그러나 일부 DB 엔진은 그들 중 하나 (것 같은 간단한 쿼리하지만 복잡한 충분한 것들에 대한 일이 없습니다) 더 나은 실행 계획을 생성 할 수 있습니다. 당신은 모두를 테스트하고 (당신의 DB 엔진)를 참조한다.

    이론적으로, 아니, 그것은 빨리해서는 안됩니다. 쿼리 최적화 프로그램은 동일한 실행 계획을 생성 할 수 있어야한다. 그러나 일부 DB 엔진은 그들 중 하나 (것 같은 간단한 쿼리하지만 복잡한 충분한 것들에 대한 일이 없습니다) 더 나은 실행 계획을 생성 할 수 있습니다. 당신은 모두를 테스트하고 (당신의 DB 엔진)를 참조한다.

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

    2.데이터베이스 엔진이 당신을 위해 쿼리를 최적화 할 수 있습니다 얼마나 잘에 ""... 모든 경첩 대 "가입하기"의 성능을 제공합니다. 또한 물리적 데이터베이스 파일 자체의 조각화 수준과 당신의 데이터베이스 파일을 저장하는 데 사용하는 경우에도 저장 기술에 내려와 고려하면되고 반환 된 열을 가질 수있는 인덱스를 가지고의 성능을 고려하고 절을 가입한다 .

    데이터베이스 엔진이 당신을 위해 쿼리를 최적화 할 수 있습니다 얼마나 잘에 ""... 모든 경첩 대 "가입하기"의 성능을 제공합니다. 또한 물리적 데이터베이스 파일 자체의 조각화 수준과 당신의 데이터베이스 파일을 저장하는 데 사용하는 경우에도 저장 기술에 내려와 고려하면되고 반환 된 열을 가질 수있는 인덱스를 가지고의 성능을 고려하고 절을 가입한다 .

    경우 MSSQL 서버 (이것은 당신에게 절을 가입하고의 기능의 아이디어를 줄 것이다) 다음과 같은 순서로 쿼리를 실행

    여기에서 찾을 수 있습니다 T-SQL 쿼리 : 다음은 마이크로 소프트 SQL 서버, 내부 마이크로 소프트 SQL 서버 2005에 대한 책의 우수한 시리즈에서 가져옵니다

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

    3.올바르게 대상 데이터베이스에 제한없이 대답 할 수있는 방법은 없습니다.

    올바르게 대상 데이터베이스에 제한없이 대답 할 수있는 방법은 없습니다.

    MS-SQL의 두 쿼리는 동일한 실행 계획을 초래할하지만 명심 :

    SELECT *
    FROM Document, DocumentStats
    WHERE DocumentStats.Id = Document.Id
      AND DocumentStats.NbViews > 500
    

    는가에 조인 조건을 WHERE 절과 불쾌한 크로스 조인을 끝낼 잊기 쉽다 때문에 정말 위험합니다.

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

    4.MySQL의에서 적어도, 그들은 모두 동일한 쿼리 최적화됩니다.

    MySQL의에서 적어도, 그들은 모두 동일한 쿼리 최적화됩니다.

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

    5.구문을 가입하기는하지만 실질적으로 동등한 내부를 사용하는 "표준"입니다. 이 OUTER JOIN 구문을 함께 일치로 사용되어야한다 주된 이유는 명확성과 이동성을 목적으로합니다.

    구문을 가입하기는하지만 실질적으로 동등한 내부를 사용하는 "표준"입니다. 이 OUTER JOIN 구문을 함께 일치로 사용되어야한다 주된 이유는 명확성과 이동성을 목적으로합니다.

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

    6.당신이 SQLite는 사용하는 경우 : SQLite는 먼저 쿼리를 실행하기 전에 어디 구문에 조인 구문을 번역하기 때문에 어디 구문이 약간 빠릅니다.

    당신이 SQLite는 사용하는 경우 : SQLite는 먼저 쿼리를 실행하기 전에 어디 구문에 조인 구문을 번역하기 때문에 어디 구문이 약간 빠릅니다.

  7. ==============================

    7.당신은 SQL 서버에 대해 구체적으로 얘기하는 경우에, 당신은 확실히 INNER JOIN 구문을 사용해야합니다. 그렇다 (개인 의견 경고!) 쉽게 읽을 수와 의도에 더 명확되는, SQL 서버 2005 년,가, 외부에 상응하는 구문은 조인 없습니다. * 표시 = 및 = * 구문 2005에서 기본적으로 지원되지 않습니다 - 당신은 그것을 지원하는 호환성 모드를 활성화해야합니다. 그것은 결국 다음 버전으로 가능한 한 빨리 제거 (또는 가능하지!)됩니다

    당신은 SQL 서버에 대해 구체적으로 얘기하는 경우에, 당신은 확실히 INNER JOIN 구문을 사용해야합니다. 그렇다 (개인 의견 경고!) 쉽게 읽을 수와 의도에 더 명확되는, SQL 서버 2005 년,가, 외부에 상응하는 구문은 조인 없습니다. * 표시 = 및 = * 구문 2005에서 기본적으로 지원되지 않습니다 - 당신은 그것을 지원하는 호환성 모드를 활성화해야합니다. 그것은 결국 다음 버전으로 가능한 한 빨리 제거 (또는 가능하지!)됩니다

    이 수단 :

    참고 또한 대중적인 신념에 반하는 것으로, 두 사람은 해당되지 않습니다. 어떤 것들은 훨씬 더 어색하고, 일부는 단순히 불가능합니다. 칼렌 델라 니의 내부 SQL Server 2000의 커버 몇 가지 예; 그 구문 어쨌든되지 않습니다에 참여하기 때문에 새로운 버전은하지 있는지 확인합니다.

  8. ==============================

    8.명시 쿼리의 의도로 유지하기 쉽게하는 것이 훨씬 명확 합류했다. 당신이 십자가 쿼리에 조인이있는 경우 또한 그들은 실수로 교차 대상이 아닌이 때문에, 메인테이너은 거기가 될 의도가 알고 조인.

    명시 쿼리의 의도로 유지하기 쉽게하는 것이 훨씬 명확 합류했다. 당신이 십자가 쿼리에 조인이있는 경우 또한 그들은 실수로 교차 대상이 아닌이 때문에, 메인테이너은 거기가 될 의도가 알고 조인.

    당신이 이제까지 외부 조인을 사용해야하는 경우, 당신은 * = 구문은 SQL 서버에서 사용되지 않으며 곧 제거 될 것이라는 점을 알아야한다. 또한 그것은 현재 모든 시간을 기대하고 정확한 결과를 제공하지 않을 수 있으므로 사용해서는 안됩니다으로 작동하지 않습니다. 명시 적 외부 믹싱 조인 절에 조인 경우 (암시 적 조인)을 읽고 이해하는 테이너에 대한 더 힘들어 쿼리를합니다.

  9. ==============================

    9.MSSQL에서 두 쿼리는 너무 차이가 없습니다, 같은 실행 계획으로 컴파일됩니다. 그것은 더 가독성에 관하여 - 나는 내가 그것을 사용할 수 있도록, 쉽게 읽을 가입 생각합니다.

    MSSQL에서 두 쿼리는 너무 차이가 없습니다, 같은 실행 계획으로 컴파일됩니다. 그것은 더 가독성에 관하여 - 나는 내가 그것을 사용할 수 있도록, 쉽게 읽을 가입 생각합니다.

  10. ==============================

    10.나는 너무 변화를하지 않는 것 같아요. (가) 두 쿼리 계획이 동일 설명하면 당신이 확인할 수 있습니다합니다. MySQL의에서 설명 할 계획보고 순서에서 당신은이 문, 예를 들어 전에 키워드를 "설명"추가해야한다

    나는 너무 변화를하지 않는 것 같아요. (가) 두 쿼리 계획이 동일 설명하면 당신이 확인할 수 있습니다합니다. MySQL의에서 설명 할 계획보고 순서에서 당신은이 문, 예를 들어 전에 키워드를 "설명"추가해야한다

    EXPLAIN
    SELECT *
    FROM Document, DocumentStats
    WHERE DocumentStats.Id = Document.Id
      AND DocumentStats.NbViews > 500
    

    나는 확실히 너무 MSSQL에 상응하는 존재입니다.

    그런데 : 난 그냥 nbviews 그러므로 당신이 가입 저장할 수 있으며, 문서 테이블에 직접 속성을 포함하는 것, 그래서 1의 관계 :이 같은이 모습은 1입니다.

  11. from https://stackoverflow.com/questions/1129923/is-a-join-faster-than-a-where by cc-by-sa and MIT license