programing

SQL 문을 sargable로 하는 것은 무엇입니까?

padding 2023. 4. 8. 08:00
반응형

SQL 문을 sargable로 하는 것은 무엇입니까?

(적어도 내가 본 바로는) sargable이란 쿼리가 쿼리에서 사용하는 실행 계획을 쿼리 엔진에서 최적화할 수 있는 것을 의미합니다.답을 찾아보려고 했지만, 그 주제에 대한 내용이 많지 않은 것 같아요.그래서 문제는 SQL 쿼리를 sargable로 만드는 것과 그렇지 않은 것은 무엇인가 하는 것입니다.어떤 서류라도 주시면 감사하겠습니다.

참고: Sargable

쿼리를 sargable로 할 수 없는 가장 일반적인 것은 where 구에 함수 내부에 필드를 포함하는 것입니다.

SELECT ... FROM ...
WHERE Year(myDate) = 2008

SQL Optimizer는 myDate에 인덱스가 있더라도 사용할 수 없습니다.표의 모든 행에 대해 문자 그대로 이 함수를 평가해야 합니다.뛰어난 사용성:

WHERE myDate >= '01-01-2008' AND myDate < '01-01-2009'

기타 예:

Bad: Select ... WHERE isNull(FullName,'Ed Jones') = 'Ed Jones'
Fixed: Select ... WHERE ((FullName = 'Ed Jones') OR (FullName IS NULL))

Bad: Select ... WHERE SUBSTRING(DealerName,4) = 'Ford'
Fixed: Select ... WHERE DealerName Like 'Ford%'

Bad: Select ... WHERE DateDiff(mm,OrderDate,GetDate()) >= 30
Fixed: Select ... WHERE OrderDate < DateAdd(mm,-30,GetDate()) 

하지 마세요:

WHERE Field LIKE '%blah%'

LIKE 값은 와일드카드 문자로 시작되므로 테이블/인덱스 스캔이 발생합니다.

하지 마세요:

WHERE FUNCTION(Field) = 'BLAH'

이로 인해 테이블/인덱스 스캔이 발생합니다.

데이터베이스 서버는 테이블 내의 모든 행에 대해 FUNTION()을 평가하여 'BLAH'와 비교해야 합니다.

가능한 경우는, 반대로 실시합니다.

WHERE Field = INVERSE_FUNCTION('BLAH')

이렇게 하면 파라미터에 대해 INVERse_FUNTION()이 한 번 실행되며 인덱스를 계속 사용할 수 있습니다.

이 답변에서 나는 데이터베이스가 충분한 커버링 인덱스를 가지고 있다고 생각한다.주제에 대한 질문은 충분히 있습니다.

대부분의 경우 쿼리의 sargability는 관련 지수의 티핑 포인트에 의해 결정됩니다.티핑 포인트는 한 테이블 또는 결과 세트를 다른 테이블로 결합하는 동안 인덱스를 검색하고 스캔하는 간의 차이를 정의합니다.물론 테이블 전체를 스캔하는 것보다 한 번의 스캔이 훨씬 빠르지만 많은 행을 스캔해야 하는 경우에는 스캔이 더 효과적일 수 있습니다.

따라서 최적화 도구에서 한 테이블의 결과 행 수가 다음 테이블의 가능한 인덱스의 티핑 포인트보다 적을 것으로 예상할 때 SQL 문이 더 잘 지워집니다.

자세한 투고와 는 이쪽에서 보실 수 있습니다.

작업이 sargable로 간주되기 위해서는 기존 인덱스를 사용할 수 있는 것만으로는 충분하지 않습니다.위의 예에서는 where 절의 인덱스 컬럼에 함수 호출을 추가해도 정의된 인덱스를 이용할 가능성이 높습니다.해당 열(인덱스)에서 모든 값을 "스캔"한 다음 제공된 필터 값과 일치하지 않는 값을 제거합니다.행 수가 많은 테이블에는 아직 충분히 효율적이지 않습니다.sargability를 진정으로 정의하는 것은 정렬된 항목 배열의 반집합 제거에 의존하는 바이너리 검색 방법을 사용하여 b-tree 인덱스를 통과하는 쿼리 기능입니다.SQL에서는 실행 계획에 "인덱스 검색"으로 표시됩니다.

언급URL : https://stackoverflow.com/questions/799584/what-makes-a-sql-statement-sargable

반응형