hdv212
چهارشنبه 14 آذر 1386, 15:04 عصر
سلام و خسته نباشید
من Dat Partitioning رو روی جدول Sales.SalesOrderDetail و Sales.SalesOrderDetail2 به صورت زیر تست کردم :
alter database AdventureWorks
add filegroup fg2001
go
alter database AdventureWorks
add filegroup fg2002
go
alter database AdventureWorks
add filegroup fg2003
go
alter database AdventureWorks
add filegroup fg2004
go
alter database AdventureWorks
add filegroup fg2005
alter database AdventureWorks
add file(name=data2001,filename='c:\data2001.ndf') to filegroup fg2001
go
alter database AdventureWorks
add file(name=data2002,filename='c:\data2002.ndf') to filegroup fg2002
go
alter database AdventureWorks
add file(name=data2003,filename='c:\data2003.ndf') to filegroup fg2003
go
alter database AdventureWorks
add file(name=data2004,filename='c:\data2004.ndf') to filegroup fg2004
go
alter database AdventureWorks
add file(name=data2005,filename='c:\data2005.ndf') to filegroup fg2005
select * from Sales.SalesOrderDetail2
create partition function pf1(datetime)
as range left
for values('20011231 23:59:59:997','20021231 23:59:59:997','20031231 23:59:59:997','20041231 23:59:59:997')
create partition scheme ps1
as partition pf1
to(fg2001,fg2002,fg2003,fg2004,fg2005)
select * from Sales.SalesOrderDetail2
alter table Sales.SalesOrderDetail2
add constraint ix1 primary key clustered (SalesOrderID,SalesOrderDetailID,ModifiedDate) on ps1(ModifiedDate)
جدول Sales.SalesOrderDetail2 یک کپی از جدول Sales.SalesOrderDetail هست که فقط خواستم تاثیر Data partitioning رو در اون ببینم، سپس از دو query زیر استفاده کردم :
-- With Partitioning
select * from Sales.SalesOrderDetail2 where datepart(year,ModifiedDate)='2001'
-- Without Partitioning
select * from Sales.SalesOrderDetail where datepart(year,ModifiedDate)='2001'
و Execution Plan هردو query رو دیدم، با کمال ناباوری دیدم که query دوم (یعنی بدون استفاده از Data Partitiioning) درصد 39 رو به خودش اختصاص داده و 61 در صد واسه query اول بود، یعنی performance بالایی به جای اینکه بیشتر باشه، کمتر شد، علت چیه و چکار کنم که performance اولی زیاد بشه ؟
توجه : همانطور که در کد اول دیدید، clustered Index بر روی سه فیلد گذاشته شده، در صورتی که در جدول اصلی بر روی دو فیلد گذاشته شده، گفتم شاید به خاطر این موضوع باشه.
من Dat Partitioning رو روی جدول Sales.SalesOrderDetail و Sales.SalesOrderDetail2 به صورت زیر تست کردم :
alter database AdventureWorks
add filegroup fg2001
go
alter database AdventureWorks
add filegroup fg2002
go
alter database AdventureWorks
add filegroup fg2003
go
alter database AdventureWorks
add filegroup fg2004
go
alter database AdventureWorks
add filegroup fg2005
alter database AdventureWorks
add file(name=data2001,filename='c:\data2001.ndf') to filegroup fg2001
go
alter database AdventureWorks
add file(name=data2002,filename='c:\data2002.ndf') to filegroup fg2002
go
alter database AdventureWorks
add file(name=data2003,filename='c:\data2003.ndf') to filegroup fg2003
go
alter database AdventureWorks
add file(name=data2004,filename='c:\data2004.ndf') to filegroup fg2004
go
alter database AdventureWorks
add file(name=data2005,filename='c:\data2005.ndf') to filegroup fg2005
select * from Sales.SalesOrderDetail2
create partition function pf1(datetime)
as range left
for values('20011231 23:59:59:997','20021231 23:59:59:997','20031231 23:59:59:997','20041231 23:59:59:997')
create partition scheme ps1
as partition pf1
to(fg2001,fg2002,fg2003,fg2004,fg2005)
select * from Sales.SalesOrderDetail2
alter table Sales.SalesOrderDetail2
add constraint ix1 primary key clustered (SalesOrderID,SalesOrderDetailID,ModifiedDate) on ps1(ModifiedDate)
جدول Sales.SalesOrderDetail2 یک کپی از جدول Sales.SalesOrderDetail هست که فقط خواستم تاثیر Data partitioning رو در اون ببینم، سپس از دو query زیر استفاده کردم :
-- With Partitioning
select * from Sales.SalesOrderDetail2 where datepart(year,ModifiedDate)='2001'
-- Without Partitioning
select * from Sales.SalesOrderDetail where datepart(year,ModifiedDate)='2001'
و Execution Plan هردو query رو دیدم، با کمال ناباوری دیدم که query دوم (یعنی بدون استفاده از Data Partitiioning) درصد 39 رو به خودش اختصاص داده و 61 در صد واسه query اول بود، یعنی performance بالایی به جای اینکه بیشتر باشه، کمتر شد، علت چیه و چکار کنم که performance اولی زیاد بشه ؟
توجه : همانطور که در کد اول دیدید، clustered Index بر روی سه فیلد گذاشته شده، در صورتی که در جدول اصلی بر روی دو فیلد گذاشته شده، گفتم شاید به خاطر این موضوع باشه.