문제

고객의 특정 현지 시간에 이메일을 보내는 프로그램을 작성 중입니다.시간대 및 시간 및 대상 시간대를 취하고 해당 시간대의 시간을 반환하는 .NET 메서드가 있습니다.그래서 내 방법은 데이터베이스에서 모든 고유 시간대를 선택하고 방법을 사용하여 올바른 시간인지 확인한 다음 해당 시간대로 데이터베이스에서 모든 클라이언트를 선택하는 것입니다.

검색어는 다음 중 하나와 유사합니다.결과 집합의 순서는 중요하지 않으므로 공용체가 좋습니다.어느 쪽이 더 빠르게 실행 되나요? 아니면 실제로 동일한 작업을 수행하나요? 라코 디스

또는 라코 디스

수정 : timezoneID는 기본 키 timezoneID 및 varchar (20) 필드 timezoneName이있는 테이블 인 tTimezone에 대한 외래 키입니다. 또한 분석기를 열고 싶지 않았기 때문에 WHERE IN를 사용했습니다.

편집 2 : 쿼리가 100ms 이내에 20 만 개의 행을 처리하므로 이제 완료되었습니다.

도움이 되었습니까?

해결책

이봐!이러한 쿼리는 동일하지 않습니다.

결과는 하나의 이메일이 하나의 시간대에만 속한다고 가정하는 경우에만 동일합니다.물론 SQL 엔진은 그것을 모르고 중복을 제거하려고합니다.따라서 첫 번째 쿼리가 더 빨라야합니다.

UNION을 사용하려는 이유를 모르는 경우 항상 UNION ALL을 사용하세요.

차이점이 무엇인지 확실하지 않은 경우 질문입니다.

참고 : 그 소리는 질문의 이전 버전 에 속합니다.

다른 팁

대부분의 데이터베이스 관련 성능 질문에 대한 실제 대답은이를 실행하고 DB가 데이터 세트에 대해 수행하는 작업을 분석하는 것입니다.계획 설명 또는 추적을 실행하여 쿼리가 적절한 인덱스에 도달하는지 확인하거나 필요한 경우 인덱스를 만듭니다.

원하는 것의 가장 큰 의미를 전달하기 때문에 IN 절을 사용하는 첫 번째 방법을 사용합니다.timezoneID는 일부 시간대 테이블에서 기본 키처럼 보이므로 이메일의 외래 키 여야하며 색인이 생성되어야합니다.DB 옵티 마이저에 따라 외래 키 인덱스에 대한 인덱스 스캔을해야한다고 생각합니다.

첫 번째 추측은

SELECT email FROM tClient WHERE timezoneID in (1, 4, 9)
가 결과를 찾기 위해 테이블을 한 번만 스캔하면되기 때문에 더 빠르 겠지만 두 쿼리 모두에 대한 실행 계획을 확인하는 것이 좋습니다.

가설을 실제로 확인할 수있는 MS SQL 쿼리 분석기는 없지만 UNION 서버에서는 3 개의 테이블 스캔을 수행해야하는 반면 WHERE IN에서는 하나만 필요하기 때문에 WHERE IN 변형이 더 빠를 것이라고 생각합니다.쿼리 분석기가있는 경우 두 쿼리에 대한 실행 계획을 확인합니다.

인터넷에서 WHERE IN 사용을 피하라는 제안을 자주 접할 수 있지만 이는 하위 쿼리가 사용되는 경우를 나타냅니다.따라서이 사례는이 권장 사항의 범위를 벗어나며 추가적으로 읽고 이해하기가 더 쉽습니다.

문제에 몇 가지 매우 중요한 정보가 누락 된 것 같습니다.우선, 날씨 timezoneID가 색인화되어 있는지 여부, 기본 키의 일부인지 여부 등이 매우 중요합니다. 모든 사람에게 분석기를 살펴 보라고 조언하지만 내 경험상 WHERE 절은 특히 더 빨라야합니다.색인.논리는 다음과 같습니다. 통합 쿼리에 추가 오버 헤드가 있으며 유형, 각 열 번호 등을 확인합니다.

"SQL Performance Tuning"책에서 저자는 UNION 쿼리가 테스트 한 모든 7 개의 DBMS (SQL Server 2000, Sybase ASE 12.5, Oracle 9i, DB2 등)에서 느리다는 것을 발견했습니다. http://books.google RpmiA # PPA33, M1 "rel="nofollow noreferrer ">.com / books? id= 3H9CC54qYeEC & pg= PA32 & vq= UNION & dq= sql + performance + tuning & source= gbs_search_s & sig= ACfU3U18uYZWYVHxr2I3uUj8kmPz9RpmiA # PPA33, M1

나중의 DBMS는 그 차이를 최적화했을지 모르지만 의심 스럽다.또한 UNION 방법은 IN에 비해 훨씬 더 길고 유지 관리가 더 어렵습니다 (3 분의 1을 원하면 어떨까요?).

UNION을 사용할 이유가없는 한 OR / IN 방법을 사용하세요.

일부 DBMS의 쿼리 최적화 프로그램은 쿼리를보다 효율적으로 만들기 위해 쿼리를 수정하므로 사용하는 DBMS에 따라 신경 쓰지 않아도됩니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top