“SARGable”이라는 단어는 실제로 무엇을 의미합니까?


23

SQL Server 사용자 "sargable" 이라는 용어를 사용합니다 . "sargable"에 대한 객관적인 구현-무시한 영원한 정의가 있는지 궁금합니다.

예를 들어, WHERE foo LIKE '%bar%'많은 사람들이 Sargable아니라고 말하지만 일부 RDBMS 는 그러한 쿼리에서 인덱스를 사용할 수 있습니다 . 무엇은하지 "스 SARGable 없습니다" 평균?

다른 참고 문헌


5
귀하의 질문은 SQL Server에 대한 것이 아니라 " sargable " 이라는 용어에 관한 것 입니다. 귀하의 질문은 다른 RDBMS와 달리 "% wordhere %"검색 조건자를 처리 할 수 ​​없기 때문에 SQL Server 만 참조했습니다.
John aka hot2use

답변:


31

용어 "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그 자체도 마찬가지입니다 . memcmpASCII를 가정하고 대소 문자를 무시하는 (두 번째 니블을 살펴보십시오) 을 작성하는 것이 비교적 쉽습니다 . 그렇게하면 사할 수 있습니까? 또한 Ypercube의 예를 @ 참조 dba.stackexchange.com/questions/162263/...
에반 캐롤

4
@EvanCarroll 스토리지 엔진 외부 (예 : 쿼리 프로세서 / 실행 엔진 / 표현 서비스) 외부에서 구현 된 데이터베이스 기능에 의존하지 않고 테이블 또는 인덱스 레코드를 직접 보는 것을 의미합니다. ypercube의 예에서 쿼리는 플래너 / 최적화 프로그램에 의해 사전 처리되어 비 SARGable 검색이 SARGable 용어로 표현됩니다.
Paul White에 따르면 GoFundMonica는

무엇 않습니다 "테이블 또는 인덱스 기록을 찾고 직접" 의미? 그것이 "테이블 또는 인덱스 레코드를 직접 관찰" 하는 방법을 잘 모르겠습니다 . 가 x=0스 SARGable은? 무엇에 대한 -0 = +0, ' ' = ''또는 공간 평등? SARGable의 예는 무엇입니까? "스토리지 엔진 외부에서 구현 된 데이터베이스 기능에 의존하지 않고" 라고 말하면 스토리지 엔진DATE() 내부에 포함 된 Ypercube의 예제 에 포함됩니다. 왜 SARGable 자체가 아닌가?
Evan Carroll

2
@EvanCarroll 참조 된 논문을 읽는 데 시간이 걸리고 그 후에이 답변을 다시 살펴보십시오. 여전히 주제에 관한 질문이있는 경우 질문 할 수 있습니다. 그것을 전달할 DATE()때 실제 (SQL Server) 기능은 아니지만 유형 변환에 대한 Mr. Cube의 약자입니다. 원한다면 채팅 으로이 문제를 논의 할 수도 있습니다 .
Paul White는 GoFundMonica가

18

저에게 SARGable은 SQL Server가 검색 조건자를 사용하여 인덱스 검색을 수행 할 수 있음을 의미합니다.

DBMS가 인덱스를 "이용할 수있다"고 말할 수는 없습니다. SQL을 사용할 수없는 술어를 사용하면 SQL Server가 클러스터되지 않은 인덱스를 스캔 할 수 있기 때문입니다.


나는 그것을 파티션 제거로 확장 할 것이다
David דודו Markovitz

9

에 따르면 프로 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;

결과는 다음과 같습니다.

[1]

SARGable 쿼리의 속성을 살펴 보자 (Index Seek)

여기에 이미지 설명을 입력하십시오

쿼리 최적화 프로그램은 시작 및 종료 인덱스에서 제한을 정의 할 수 있습니다. 조회 할 검색 인수가 있습니다.

이제 비 SARGable 쿼리 :

여기에 이미지 설명을 입력하십시오

술어 '% non .. %'의 시작으로 조회 옵티마이 저가 인덱스의 시작과 끝 또는 범위를 정의 할 수 없습니다. 이제 전체 테이블을 검색해야합니다 (스캔).


다시 말하지만, 나중에 색인을 생성 WHERE name like '%non-SARGable%'하면 조건을 강제로 만들 수 있습니까? 그렇다면 특정 구현 단점에 대해 이야기하고 있지 않습니까? IE., 우리는 "SQL Server 2016
Evan Carroll

1
SQL Server 릴리스에는 무엇이든지 가능합니다. 인덱스 시작점을 염두에두고 술어의 시작 부분에 와일드 카드가 있으면 쿼리 최적화 프로그램이 인덱스 내에서 검색 할 값 범위를 정의하기가 매우 어려울 것입니다. 따라서 스캔과 술어를 사용하면 SARGable이 아닌 술어라고합니다.
Vic Work

2
물론 구현에 따라 다릅니다. WHERE DATE(datetime_column) = '2001-01-01'예를 들어, 최신 SQL Server 버전 (2008 이상)에서는 "sargable"(인덱스 검색 수행)이지만 이전 버전에서는 그렇지 않습니다.
ypercubeᵀᴹ
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.