데이터베이스 개발자 질문과 답변 게시판

데이터베이스 개발/운영 관련 질문과 답변을 올리는 게시판입니다. 궁금하신 내용을 이곳에서 문의하시면 SQLER 분들의 답변을 받으실 수 있습니다. 문의를 하실때에는 최근 작업하신 특이 사항이나, 장애 발생 전 상황을 상세히 올려 주시면 답글을 적어주시는 SQLER분들의 답변이 더 정확할 수 있으니 도움 되시길 바랍니다. 쿼리 문의일 경우, 실제 문제가 재현되는 테이블생성, 샘플데이터 생성 쿼리를 함께 올려 주시면 더 빠르고 정확한 쿼리 문의 응답이 가능합니다.

sql 2008 서버 enterprise evaluation 받아서 테스트하고 있는데,  잘 이해가 되지 않는 점이 있어서 

이렇게 질문 올립니다.


파티션 테이블을 생성하고,  데이터를 넣은 다음,  특정 파티션에 해당하는 범위의 조건만 where절에 넣고

실행하여 트레이스를 뜨면 당연히 해당 파티션을 조회한 것이 실행계획에 나오고,   logical read도 

전체를 조회했을때와 달라야 하는데,   해당 파티션을 모두 검색하고,  logical read도 전체를 검색할때와

똑같이 나옵니다.  왜 이럴까요?


아래는 책(SQL서버 튜닝원리와 해법 BY 정재우 )에 있는 내용을 실습한 것입니다.


-- 파티션 함수 생성

create partition function pf_OrderDate(char(8))

as range left

for values (

              '1997'

             ,'1998'

             ,'1999'

           )

go


-- 파티션 스키마 생성

create partition scheme ps_OrderDate

as partition pf_OrderDate

to ([primary],[primary],[primary],[primary])

go


--파티션 테이블 생성

create table Orders_range (

  OrderID    int identity(1,1) not null

 ,CustomerID nchar(5) null

 ,EmployeeID int      null

 ,OrderDate  char(8)  null

 ,RequiredDate datetime null

 ,ShippedDate datetime   null

 ,ShipVia     int  null

 ,Freight     money null

 ,ShipName    nvarchar(40) null

 ,ShipAddress nvarchar(60) null

 ,ShipCity    nvarchar(15) null

 ,ShipRegion  nvarchar(15) null

 ,ShipPostalCode nvarchar(10) null

 ,ShipCountry    nvarchar(15) null

 )

 on ps_OrderDate(OrderDate)

 go


insert into orders_range

select 

 a.CustomerID        

 ,a.EmployeeID        

 ,convert(char(8), a.OrderDate,112) as orderdate         

 ,a.RequiredDate      

 ,a.ShippedDate       

 ,a.ShipVia           

 ,a.Freight           

 ,a.ShipName          

 ,a.ShipAddress       

 ,a.ShipCity          

 ,a.ShipRegion        

 ,a.ShipPostalCode    

 ,a.ShipCountry     

 from Northwind.dbo.orders a  

     ,(select top 100 * from Northwind.dbo.Orders) b

 go


--여기까지 하면 OrderDATE에 '19960704'  부터 '19980506' 까지의 데이터가 들어갑니다.

--테이블 파티션생성 여부도 확인하였습니다.

-- 아래 쿼리를 조회하면 파티션이 3개가 나옵니다.


select $partition.pf_OrderDate(Orderdate) as '파티션 번호'

      ,COUNT(*), SUM(freight)

from Orders_range

group by $partition.pf_Orderdate(Orderdate)

order by 1

go


--그리고 트레이스를 떠보면,  특정파티션에 해당하는 ORDERDATE만 조회했는데 4개 파티션을 모두 검색한다고 나오네요.


set statistics profile on

set statistics io on

set statistics time on


-- 1996 년 데이터만 들어간 파티션 조회

select * from orders_range 

where OrderDate <='19961201'


(12100개 행이 영향을 받음)

테이블 'Orders_range'. 검색 수 4, 논리적 읽기 수 1988, 물리적 읽기 수 0, 미리 읽기 수 0, LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.


 SQL Server 실행 시간: 

 CPU 시간 = 109밀리초, 경과 시간 = 766밀리초


SELECT * FROM [orders_range] WHERE [OrderDate]<=@1

  |--Table Scan(OBJECT:([jwjung].[dbo].[Orders_range]), 

                         WHERE:([jwjung].[dbo].[Orders_range].[OrderDate]<=[@1]))


--전체 파티션 조회

select * from orders_range 


(83000개 행이 영향을 받음)

테이블 'Orders_range'. 검색 수 4, 논리적 읽기 수 1988, 물리적 읽기 수 0, 미리 읽기 수 0,

                                 LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.


 SQL Server 실행 시간: 

 CPU 시간 = 234밀리초, 경과 시간 = 3725밀리초

테이블 'Orders_range'. 검색 수 4, 논리적 읽기 수 1988, 물리적 읽기 수 0, 미리 읽기 수 0,
                                 LOB 논리적 읽기 수 0, LOB 물리적 읽기 수 0, LOB 미리 읽기 수 0.

select * from orders_range
  |--Table Scan(OBJECT:([jwjung].[dbo].[Orders_range]))


여기서 궁금한 점은,  경과시간은 차이가 나는 걸로 나오는데, 

실행계획은 특정 파티션을 읽었다는 내용이 안나오고,

논리적 읽기는 둘다 1988로 동일합니다.  

왜 그런걸까요?  아무리 해봐도 모르겠네요.  

답변 좀 꼭 부탁드립니다.   운영서버의 테이블에 적용하고  달라진 결과를 보고해야하는데,

답답하네요.   


No. Subject Author Date Views
6458 sql 로그인 관련문의 [5] hhhh 2013.02.14 9616
6457 <>의미가 무엇인가요? [2] q0822kang 2013.02.14 6795
6456 소유자 명시 없이는 조회가 안되는 경우를 보신적이 있나요? [6] 문희성 2013.02.14 6833
6455 database 생성 스크립트 질문 입니다. [3] 디비러 2013.02.14 6939
6454 Intellisense 가 키워드에서는 안 되는 건가요? [2] stylix 2013.02.13 7770
6453 쿼리문에 대해서. [2] 지성아빠짱짱짱 2013.02.13 7196
6452 starting up database 로그가 계속 찍힙니다 [4] 토토로 2013.02.13 8020
6451 혹시 dynamics AX2009사용하시나요? [1] 문수정 2013.02.13 7163
6450 SQL에서 값을 입력받으려면 어떻게 하나요? 김시준 2013.02.13 7672
6449 웹서버를 이용한 NLB가능할까요? [2] 문수정 2013.02.12 7262
6448 adhoc 쿼리에 대한 질문입니다. [2] 카루카루 2013.02.12 7515
6447 질문있습니다.! [1] 멍이 2013.02.12 7264
6446 로그 해석 좀 해주세요ㅜㅜ [1] 웁스 2013.02.12 7599
6445 테이블 단위로 백업을 할려면 어떻게 하나요? [3] 에버그린 2013.02.12 9420
6444 트랜젝션관련 문의 [2] 형님 2013.02.12 6941
» 파티션 테이블 생성했는데, 트레이스를 뜨면 특정 파티션을 조회하지 않습니다. [5] 하흥수 2013.02.11 8339
6442 데드락 문의 [9] 몽블랑 2013.02.09 13112
6441 행개수가 지속적으로 증가할때 대응방법은?? [2] 뷰롱이 2013.02.08 7654
6440 질문은 좀 바꿔서 물어보겠습니다 퍼센트 계산;; [3] 킹멋쟁 2013.02.08 12524
6439 이제 90퍼센트온거같은데 나머지 10에서 답이안나오네요;; 멍이 2013.02.08 7738





XE Login