SQL Server/SQL Server Tip

하위 쿼리 사용시 공간 인덱스 사용 불가

SungWookKang 2015. 7. 23. 08:51
반응형

하위 쿼리 사용시 공간 인덱스 사용 불가 

   

-       Version : SQL Server 2012 

   

SQL Server 2012 부터는 공간 인덱스를 지원한다. 공간 인덱스는 공간 열을 인덱싱 할 수 있는 확장된 인덱스의 유형이다. 공간 열은 Geometry 또는 Geography와 같은 공간 데이터를 포함하는 테이블 열이다. 

l  공간 인덱스 : http://sqlmvp.kr/140201241880 

   

이번 포스트는 CSS SQL Server Engineers 블로그에 게시된 내용으로 필자가 읽고 이해한 내용을정리 하였으며 번역의 오류나 기술적 오류가 있음을 미리 알려둔다. 이번 포스트의 팁을 활용하여 SQL Server 쿼리 처리의 공간 인덱스를 사용하여보자. 이 팁은 공간 인덱스 뿐만 아니라 일반적인 쿼리에도 적용 된다. 

   

   

l  공간 메서드는 조건문의 왼쪽에 위치한다(where clause) 

col.STIntersects(@val) = 1 -- Can use the index if costing is appropriate
1 = col.STIntersects(@val) -- Unlikely to use index, use previous form 

   

   

l  공간 메서드에 전달된 값은 상수이어야 한다. 

col.STDistance(@val) = 1 * 10000 -- Can use the index if costing is appropriate
col.STDistance(@val / 10000) = 1 -- Unlikely to use index, use previous form 

   

   

복잡한 쿼리 

col.STDistance(@val) = 1 * 10000 -- Can use the index if costing is appropriate  

col.STDistance(@val / 10000) = 1 -- Unlikely to use index, use previous form 

   

   

복잡한 쿼리 

/* The subquery form does not consider the index */ 

Select * from Spat where col2.STIntersects((select col2 from Spat where Id = 23 and col2 is not null))=

/* Using index hint - getting an error message for this query form */  

-- Msg 8622, Level 16, State 1, Line 1  

-- Query processor could not produce a query plan because of the hints defined in this query.  

Select * from Spat with (index(SpatIDX)) where col2.STIntersects( (select col2 from Spat where Id =23) ) =

/* Variable or Join forms attempt to use the index */ 

Declare @i geography  

Set @i = (select col2 from Spat where Id =23)  

Select * from Spat where col2.STIntersects((@i))=1 order by Id  

Select s1.* from Spat as s1  

join Spat as s2 ON 

s1.col2.STIntersects(s2.col2) = 1  

and s2.Id = 23  

order by s1.Id 

   

우리는 변수를 참조하거나 조인구문을 사용하여 SQL Server가 하위 쿼리 처리시 고려되지 않은 공간 인덱스의 사용에 대한 평가를 할 수 있다. 쿼리가 인덱스를 사용하도록 고려되어 있는지 확인해야 한다. 

   

[참고자료] 

http://blogs.msdn.com/b/psssql/archive/2013/12/09/spatial-index-is-not-used-when-subquery-used.aspx 

   

   

2013-12-10 / 강성욱 / http://sqlmvp.kr 

반응형