[SQL] A는 빠르게 WHERE 이상의 조인?
SQLA는 빠르게 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.이론적으로, 아니, 그것은 빨리해서는 안됩니다. 쿼리 최적화 프로그램은 동일한 실행 계획을 생성 할 수 있어야한다. 그러나 일부 DB 엔진은 그들 중 하나 (것 같은 간단한 쿼리하지만 복잡한 충분한 것들에 대한 일이 없습니다) 더 나은 실행 계획을 생성 할 수 있습니다. 당신은 모두를 테스트하고 (당신의 DB 엔진)를 참조한다.
이론적으로, 아니, 그것은 빨리해서는 안됩니다. 쿼리 최적화 프로그램은 동일한 실행 계획을 생성 할 수 있어야한다. 그러나 일부 DB 엔진은 그들 중 하나 (것 같은 간단한 쿼리하지만 복잡한 충분한 것들에 대한 일이 없습니다) 더 나은 실행 계획을 생성 할 수 있습니다. 당신은 모두를 테스트하고 (당신의 DB 엔진)를 참조한다.
-
==============================
2.데이터베이스 엔진이 당신을 위해 쿼리를 최적화 할 수 있습니다 얼마나 잘에 ""... 모든 경첩 대 "가입하기"의 성능을 제공합니다. 또한 물리적 데이터베이스 파일 자체의 조각화 수준과 당신의 데이터베이스 파일을 저장하는 데 사용하는 경우에도 저장 기술에 내려와 고려하면되고 반환 된 열을 가질 수있는 인덱스를 가지고의 성능을 고려하고 절을 가입한다 .
데이터베이스 엔진이 당신을 위해 쿼리를 최적화 할 수 있습니다 얼마나 잘에 ""... 모든 경첩 대 "가입하기"의 성능을 제공합니다. 또한 물리적 데이터베이스 파일 자체의 조각화 수준과 당신의 데이터베이스 파일을 저장하는 데 사용하는 경우에도 저장 기술에 내려와 고려하면되고 반환 된 열을 가질 수있는 인덱스를 가지고의 성능을 고려하고 절을 가입한다 .
경우 MSSQL 서버 (이것은 당신에게 절을 가입하고의 기능의 아이디어를 줄 것이다) 다음과 같은 순서로 쿼리를 실행
여기에서 찾을 수 있습니다 T-SQL 쿼리 : 다음은 마이크로 소프트 SQL 서버, 내부 마이크로 소프트 SQL 서버 2005에 대한 책의 우수한 시리즈에서 가져옵니다
-
==============================
3.올바르게 대상 데이터베이스에 제한없이 대답 할 수있는 방법은 없습니다.
올바르게 대상 데이터베이스에 제한없이 대답 할 수있는 방법은 없습니다.
MS-SQL의 두 쿼리는 동일한 실행 계획을 초래할하지만 명심 :
SELECT * FROM Document, DocumentStats WHERE DocumentStats.Id = Document.Id AND DocumentStats.NbViews > 500
는가에 조인 조건을 WHERE 절과 불쾌한 크로스 조인을 끝낼 잊기 쉽다 때문에 정말 위험합니다.
-
==============================
4.MySQL의에서 적어도, 그들은 모두 동일한 쿼리 최적화됩니다.
MySQL의에서 적어도, 그들은 모두 동일한 쿼리 최적화됩니다.
-
==============================
5.구문을 가입하기는하지만 실질적으로 동등한 내부를 사용하는 "표준"입니다. 이 OUTER JOIN 구문을 함께 일치로 사용되어야한다 주된 이유는 명확성과 이동성을 목적으로합니다.
구문을 가입하기는하지만 실질적으로 동등한 내부를 사용하는 "표준"입니다. 이 OUTER JOIN 구문을 함께 일치로 사용되어야한다 주된 이유는 명확성과 이동성을 목적으로합니다.
-
==============================
6.당신이 SQLite는 사용하는 경우 : SQLite는 먼저 쿼리를 실행하기 전에 어디 구문에 조인 구문을 번역하기 때문에 어디 구문이 약간 빠릅니다.
당신이 SQLite는 사용하는 경우 : SQLite는 먼저 쿼리를 실행하기 전에 어디 구문에 조인 구문을 번역하기 때문에 어디 구문이 약간 빠릅니다.
-
==============================
7.당신은 SQL 서버에 대해 구체적으로 얘기하는 경우에, 당신은 확실히 INNER JOIN 구문을 사용해야합니다. 그렇다 (개인 의견 경고!) 쉽게 읽을 수와 의도에 더 명확되는, SQL 서버 2005 년,가, 외부에 상응하는 구문은 조인 없습니다. * 표시 = 및 = * 구문 2005에서 기본적으로 지원되지 않습니다 - 당신은 그것을 지원하는 호환성 모드를 활성화해야합니다. 그것은 결국 다음 버전으로 가능한 한 빨리 제거 (또는 가능하지!)됩니다
당신은 SQL 서버에 대해 구체적으로 얘기하는 경우에, 당신은 확실히 INNER JOIN 구문을 사용해야합니다. 그렇다 (개인 의견 경고!) 쉽게 읽을 수와 의도에 더 명확되는, SQL 서버 2005 년,가, 외부에 상응하는 구문은 조인 없습니다. * 표시 = 및 = * 구문 2005에서 기본적으로 지원되지 않습니다 - 당신은 그것을 지원하는 호환성 모드를 활성화해야합니다. 그것은 결국 다음 버전으로 가능한 한 빨리 제거 (또는 가능하지!)됩니다
이 수단 :
참고 또한 대중적인 신념에 반하는 것으로, 두 사람은 해당되지 않습니다. 어떤 것들은 훨씬 더 어색하고, 일부는 단순히 불가능합니다. 칼렌 델라 니의 내부 SQL Server 2000의 커버 몇 가지 예; 그 구문 어쨌든되지 않습니다에 참여하기 때문에 새로운 버전은하지 있는지 확인합니다.
-
==============================
8.명시 쿼리의 의도로 유지하기 쉽게하는 것이 훨씬 명확 합류했다. 당신이 십자가 쿼리에 조인이있는 경우 또한 그들은 실수로 교차 대상이 아닌이 때문에, 메인테이너은 거기가 될 의도가 알고 조인.
명시 쿼리의 의도로 유지하기 쉽게하는 것이 훨씬 명확 합류했다. 당신이 십자가 쿼리에 조인이있는 경우 또한 그들은 실수로 교차 대상이 아닌이 때문에, 메인테이너은 거기가 될 의도가 알고 조인.
당신이 이제까지 외부 조인을 사용해야하는 경우, 당신은 * = 구문은 SQL 서버에서 사용되지 않으며 곧 제거 될 것이라는 점을 알아야한다. 또한 그것은 현재 모든 시간을 기대하고 정확한 결과를 제공하지 않을 수 있으므로 사용해서는 안됩니다으로 작동하지 않습니다. 명시 적 외부 믹싱 조인 절에 조인 경우 (암시 적 조인)을 읽고 이해하는 테이너에 대한 더 힘들어 쿼리를합니다.
-
==============================
9.MSSQL에서 두 쿼리는 너무 차이가 없습니다, 같은 실행 계획으로 컴파일됩니다. 그것은 더 가독성에 관하여 - 나는 내가 그것을 사용할 수 있도록, 쉽게 읽을 가입 생각합니다.
MSSQL에서 두 쿼리는 너무 차이가 없습니다, 같은 실행 계획으로 컴파일됩니다. 그것은 더 가독성에 관하여 - 나는 내가 그것을 사용할 수 있도록, 쉽게 읽을 가입 생각합니다.
-
==============================
10.나는 너무 변화를하지 않는 것 같아요. (가) 두 쿼리 계획이 동일 설명하면 당신이 확인할 수 있습니다합니다. MySQL의에서 설명 할 계획보고 순서에서 당신은이 문, 예를 들어 전에 키워드를 "설명"추가해야한다
나는 너무 변화를하지 않는 것 같아요. (가) 두 쿼리 계획이 동일 설명하면 당신이 확인할 수 있습니다합니다. MySQL의에서 설명 할 계획보고 순서에서 당신은이 문, 예를 들어 전에 키워드를 "설명"추가해야한다
EXPLAIN SELECT * FROM Document, DocumentStats WHERE DocumentStats.Id = Document.Id AND DocumentStats.NbViews > 500
나는 확실히 너무 MSSQL에 상응하는 존재입니다.
그런데 : 난 그냥 nbviews 그러므로 당신이 가입 저장할 수 있으며, 문서 테이블에 직접 속성을 포함하는 것, 그래서 1의 관계 :이 같은이 모습은 1입니다.
from https://stackoverflow.com/questions/1129923/is-a-join-faster-than-a-where by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] NOT 거래 SQL에 존재하는 반대 경우를 제외하고는 사용 하는가? (0) | 2020.05.11 |
---|---|
[SQL] 어떻게 SQL 서버와 갱신 전의 트리거를 할 수 있습니까? (0) | 2020.05.11 |
[SQL] EF 4.1 예외 "공급자는 ProviderManifestToken 문자열을 반환하지 않았습니다" (0) | 2020.05.11 |
[SQL] 행 반환 번호는 UPDATE 문에 의해 영향을 (0) | 2020.05.11 |
[SQL] 어떻게 2000 SQL 서버의 날짜 가득 임시 테이블을 생성 할 수 있습니까? (0) | 2020.05.11 |