SQL Server 사용자 는 "sargable" 이라는 용어를 사용합니다 . "sargable"에 대한 객관적인 구현-무시한 영원한 정의가 있는지 궁금합니다.
예를 들어, WHERE foo LIKE '%bar%'
많은 사람들이 Sargable 이 아니라고 말하지만 일부 RDBMS 는 그러한 쿼리에서 인덱스를 사용할 수 있습니다 . 무엇은하지 "스 SARGable 없습니다" 평균?
다른 참고 문헌
SQL Server 사용자 는 "sargable" 이라는 용어를 사용합니다 . "sargable"에 대한 객관적인 구현-무시한 영원한 정의가 있는지 궁금합니다.
예를 들어, WHERE foo LIKE '%bar%'
많은 사람들이 Sargable 이 아니라고 말하지만 일부 RDBMS 는 그러한 쿼리에서 인덱스를 사용할 수 있습니다 . 무엇은하지 "스 SARGable 없습니다" 평균?
다른 참고 문헌
답변:
용어 "sargable"은 P. Griffiths Selinger et al. 그들의 1979 종이 "관계형 데이터베이스 관리 시스템에 액세스 경로 선택"에서 ACM에 의해 출판 . 비 ACM 회원의 경우 http://cs.stanford.edu/people/chrismre/cs345/rl/selinger.pdf 에 해당 논문의 사본이 있습니다 .
용어는이 단락에서 정의됩니다.
인덱스 및 세그먼트 1 스캔은 선택적으로 RSI 2 호출자 에게 리턴되기 전에 튜플에 적용되는 검색 인수 (또는 SARGS)라고하는 술어 세트를 취할 수 있습니다 . 튜플이 술어를 만족하면 리턴됩니다. 그렇지 않으면 스캔은 SARGS를 만족하거나 세그먼트 또는 지정된 인덱스 값 범위를 소진하는 튜플을 찾을 때까지 계속됩니다. 이는 RSS 내에서 효과적으로 거부 될 수있는 튜플에 대한 RSI 호출의 오버 헤드를 제거함으로써 비용을 줄입니다. 모든 술어가 SARGS가 될 수있는 형식은 아닙니다. 스 SARGable 술어 '항목 비교 연산자 값 "(형태에 투입 될 수 있거나) 형태 중 하나이다. SARGS는 이러한 술어의 부울 식 표현으로 분리형 정규 형식으로 표시됩니다.
다시 말해, Sargable 술어는 테이블 또는 인덱스 레코드를 직접 관찰하여 스토리지 엔진 (액세스 방법)으로 해결할 수있는 것입니다. 반대로 Sargable 술어는 조치를 수행하기 위해 더 높은 레벨의 DBMS가 필요합니다. 예를 들어, 각 레코드 WHERE lastname = 'Doe'
필드 lastname
의 내용을보고 스토리지 엔진 이 결과를 결정할 수 있습니다 . 반면, WHERE UPPER(lastname) = 'DOE'
SQL 엔진에 의한 함수 실행이 필요합니다. 즉, 스토리지 엔진은 읽은 모든 행 (가능한 다른 가능한 술어와 일치하는 경우)을 SQL 엔진으로 다시 반환하여 추가 CPU 비용을 발생시켜야합니다. .
원본 정의에서 sargable 술어는 "컬럼 비교 연산자 값"조건이 충족되는 한 인덱스 스캔뿐만 아니라 테이블 (시스템 R 용어의 세그먼트) 스캔에도 적용 할 수 있음을 알 수 있습니다. 스토리지 엔진에 의해 평가됩니다. 실제로 여러 가지 방법으로 시스템 R의 자손 인 Db2의 경우가 있습니다 .
인덱스 Sargable 술어는 검색을 대괄호로 사용하는 데 사용되지 않지만, 술어에 포함 된 열이 인덱스 키의 일부이므로 인덱스를 선택하면 인덱스에서 평가됩니다. 이 술어는 인덱스 관리자에 의해 평가됩니다.
데이터 Sargable 술어는 인덱스 관리자가 평가할 수 없지만 DMS (Data Management Services)는 평가할 수있는 술어입니다. 일반적으로 이러한 술어는 기본 테이블에서 개별 행에 액세스해야합니다. 필요한 경우 DMS는 조건자를 평가하는 데 필요한 열을 검색합니다.
SQL Server에서 sargable 술어가 인덱스 검색을 사용하여 해결할 수있는 술어라는 사실은 스토리지 엔진이 테이블 스캔 중에 이러한 술어를 적용 할 수 없는지에 따라 결정됩니다.
Sargable 및 Sargable 술어는 때때로 각각 "stage 1"및 "stage 2"술어로 설명됩니다 (이는 Db2 용어 에서 비롯됨 ). 테이블 또는 인덱스 레코드를 읽는 동안 가장 낮은 레벨의 쿼리 처리에서 1 단계 술어를 평가할 수 있습니다. 1 단계 조건과 일치하는 행 (있는 경우)은 평가의 다음 단계 인 2 단계로 전송됩니다.
1- 시스템 R의 세그먼트는 테이블 튜플의 물리적 스토리지입니다. 세그먼트 스캔은 다른 DBMS의 테이블 스캔과 다소 동일합니다.
2 -RSI-RSS 3 인터페이스, 튜플 지향 쿼리 인터페이스. 이 설명과 관련된 인터페이스 함수는 NEXT이며, 다음 행 일치 쿼리 술어를 리턴합니다.
3 -RSS 또는 시스템 R의 스토리지 서브 시스템 인 Research Storage System
= UPPER()
함수 호출을 의미 하지만 memcmp
그 자체도 마찬가지입니다 . memcmp
ASCII를 가정하고 대소 문자를 무시하는 (두 번째 니블을 살펴보십시오) 을 작성하는 것이 비교적 쉽습니다 . 그렇게하면 사할 수 있습니까? 또한 Ypercube의 예를 @ 참조 dba.stackexchange.com/questions/162263/...
x=0
스 SARGable은? 무엇에 대한 -0 = +0
, ' ' = ''
또는 공간 평등? SARGable의 예는 무엇입니까? "스토리지 엔진 외부에서 구현 된 데이터베이스 기능에 의존하지 않고" 라고 말하면 스토리지 엔진DATE()
내부에 포함 된 Ypercube의 예제 에 포함됩니다. 왜 SARGable 자체가 아닌가?
DATE()
때 실제 (SQL Server) 기능은 아니지만 유형 변환에 대한 Mr. Cube의 약자입니다. 원한다면 채팅 으로이 문제를 논의 할 수도 있습니다 .
저에게 SARGable은 SQL Server가 검색 조건자를 사용하여 인덱스 검색을 수행 할 수 있음을 의미합니다.
DBMS가 인덱스를 "이용할 수있다"고 말할 수는 없습니다. SQL을 사용할 수없는 술어를 사용하면 SQL Server가 클러스터되지 않은 인덱스를 스캔 할 수 있기 때문입니다.
에 따르면 프로 SQL 서버 내부 드미트리 Korotkevitch에 의해 :
Search ARgument ABLE 술어는 인덱스가 존재하는 경우 SQL SERVER가 인덱스 탐색 조작을 사용할 수있는 술어입니다.
SARGable 술어는 SQL Server가 단일 값 또는 인덱스 키 값 범위를 분리하여 처리 할 수있는 술어입니다.
: 스 SARGable 술어는 다음 연산자를 포함
=
,>
,>=
,<
,<=
,IN
,BETWEEN
, 및LIKE
( 프리픽스 매칭의 경우 )비 스 SARGable 연산자는 다음과 같습니다 :
NOT
,NOT IN
,<>
,과LIKE
( 하지 접두사 일치 )뿐만 아니라 테이블에 대한 기능이나 계산의 사용, 데이터 유형이 만든 인덱스를 이행하지 않는 유형 변환을.
예 :
WHERE name like 'SARGable%'
WHERE name like '%non-SARGable%'
데모 :
DROP TABLE dbo.Testing;
GO
CREATE TABLE Testing (
WeirdDatatype int NOT NULL,
SomethingElse char(200)
);
CREATE NONCLUSTERED INDEX IDX_ALWAYS_SARGable
ON dbo.Testing( SomethingElse);
CREATE NONCLUSTERED INDEX IDX_NOT_ALWAYS_SARGable
ON dbo.Testing(SomethingElse);
INSERT INTO dbo.Testing
( WeirdDatatype, SomethingElse )
SELECT TOP 1000 m.message_id, CONVERT(char(200), m.text)
FROM sys.messages AS m;
이제 우리는 실행합니다 :
SELECT *
FROM dbo.Testing AS t
WHERE t.WeirdDatatype = 1001;
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE 'Line%'
SELECT *
FROM dbo.Testing AS t
WHERE t.SomethingElse LIKE '%Line%'
AND t.WeirdDatatype = 1001;
결과는 다음과 같습니다.
SARGable 쿼리의 속성을 살펴 보자 (Index Seek)
쿼리 최적화 프로그램은 시작 및 종료 인덱스에서 제한을 정의 할 수 있습니다. 조회 할 검색 인수가 있습니다.
이제 비 SARGable 쿼리 :
술어 '% non .. %'의 시작으로 조회 옵티마이 저가 인덱스의 시작과 끝 또는 범위를 정의 할 수 없습니다. 이제 전체 테이블을 검색해야합니다 (스캔).
WHERE name like '%non-SARGable%'
하면 조건을 강제로 만들 수 있습니까? 그렇다면 특정 구현 단점에 대해 이야기하고 있지 않습니까? IE., 우리는 "SQL Server 2016
WHERE DATE(datetime_column) = '2001-01-01'
예를 들어, 최신 SQL Server 버전 (2008 이상)에서는 "sargable"(인덱스 검색 수행)이지만 이전 버전에서는 그렇지 않습니다.