2012-02-10 2 views
2

내 검색어는 s-l-o-w입니다. 색인을 평가하고 다시 작성하지만 누군가 MyField의 색인이이 검색어에 사용되는지 알려 줄 수 있습니까?ISNULL : 성능 향상?

SELECT ISNULL(MyField , 'No Data') 
FROM MyTable 

내 생각은 다음과 같습니다

  • SQL은 가능한 인덱스를 사용하거나 CASE는 IF, 필드를 테스트합니다.
  • MyField가 테스트됩니다.
  • 따라서 SQL은 인덱스를 사용하여 MyField를 테스트 할 수 있어야합니다.

내 질문은 :

  • 가 null 값이 인덱스 있는가?
  • IF, WHERE, CASE 등이 없으면 SQL은 인덱스를 사용합니까?
  • ISNULL보다 CASE rathar를 사용하면 차이가 있습니까?

감사합니다. 질문에 대한

스콧

+1

귀하의 특정 상황에 대한 정보는 거의 알려주지 않았습니다. MyTable의 구조 나 크기를 알 수 없습니다. 현재 표시하고있는 쿼리는 모든 행을 반환하므로 인덱스를 사용하지 않습니다. 더 많은 정보를 제공해 주시면 S-l-o-w 인 이유를 설명 할 수 있습니다. –

답변

1

예, 해당 필드에 색인이있는 경우 색인이 사용됩니다. ISNULL은 관련이 없습니다. 것

BEGIN TRAN 

--Create test table and add some dummy data 
CREATE TABLE MyTable(MyField VARCHAR(20)) 
INSERT INTO MyTable SELECT 'test1' 
INSERT INTO MyTable SELECT 'test2' 
INSERT INTO MyTable SELECT NULL 
INSERT INTO MyTable SELECT 'test3' 

-- Run query with ISNULL (note that a Table Scan is done) 
SELECT ISNULL(MyField , 'No Data') FROM MyTable 
-- Run query without ISNULL (note that a Table Scan is done) 
SELECT MyField FROM MyTable 

-- Now create an index and compare the execution plans for the same queries 
CREATE NONCLUSTERED INDEX IX_MyTable_MyField ON MyTable (MyField) 

-- Run query with ISNULL (note that an Index Scan is done) 
SELECT ISNULL(MyField , 'No Data') FROM MyTable 
-- Run query without ISNULL (note that an Index Scan is done) 
SELECT MyField FROM MyTable 

ROLLBACK 

인덱스 스캔이 훨씬 빠른 테이블 스캔보다, 그래서 인덱스 이후의 쿼리가 생성됩니다

다음과 같이 당신은 그것을 사용하는 인덱스 확인하기 위해 쿼리 실행 계획을 켭니다 (이 직접 테스트 할 수 있습니다

+0

Brilliant. 따라서 SQL은 여전히 ​​모든 값을 읽습니다. 그러나 필드가 인덱싱되면 SQL은 테이블에서 해당 값을 읽을 필요가 없으며 인덱스 대신 인덱스를 읽을 수 있습니다. – Scott

+0

예, 비 클러스터형 인덱스는 인덱싱 된 데이터 (이 경우 한 열)가있는 마이크로 버전의 테이블과 같습니다. 그래서 질의는 적은 양의 데이터를 탐색합니다. –

1

바로 여기에 내 생각 :

< <가 null 값은 인덱스 있습니까?

null 값은 다른 값으로 인덱싱됩니다.

< < IF, WHERE, CASE 등이 없으면 SQL에서 색인을 사용합니까?

사실, 그렇습니다. IF 또는 CASE 문과 같은 의미를 갖는 방법이 있기 때문입니다.

< < ISNULL보다 CASE rathar를 사용하면 차이가 있습니까?

표시가 다른 점은 동일합니다.

HTH.

3

참고로, "Where"절에 대해 말하면 답변이 달라집니다.

SELECT ISNULL(MyField , 'No Data') 
FROM MyTable 
WHERE MyField ='myvalue' 

SQL 서버는 인덱스 (당신은 항상 목표로해야하는지입니다) SEEK 할 것입니다,하지만 당신이 할 경우 : 당신이 할 경우

SELECT ISNULL(MyField , 'No Data') 
FROM MyTable 
WHERE isNull(myColumn, 'no data') is not null --I know this check doesn't make sense, but it's just for the sake of illustration. Imagine another function instead of isNull like substring or getdate... 

SQL Server는 인덱스 SCAN을 사용합니다

SQL Server에서 인덱스를 사용 중인지 여부에 관계없이 인덱스에서 수행중인 작업, 검색 또는 검색을 스스로에게 물어봐야합니다.