怎样建立分区表加快查询速度?

zhuxianzhu 2009-02-05 01:48:18
怎样建立分区表加快查询速度?
有一个表有1200万数据,都是按年份存放的
我想把表按年份分割成几个区

请问怎样实现,分好区后又怎样查询?
...全文
761 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzxap 2009-02-25
  • 打赏
  • 举报
回复
  你是不是也在苦苦寻求优化自己的SQL Server数据库的方法?如果你的数据库里有不少非常大的表格,分区功能能够帮到你很大的忙,因为它可以把这些大表格分割成独立文件组。这个技术可以让你把数据分布在不同的物理磁盘中,并通过调节它们的并行性能来最优化你的查询性能。
  对SQL Server数据表进行分区的过程分为三个步骤:
  1)建立分区函数
  2)建立分区方案
  3)对表格进行分区
  第一个步骤:建立分区函数
  分区函数定义how,即你想要SQL Server如何对数据进行分区。这里就不以某一个表格作为例子,而是总体概括分割数据的技术。
  分区是通过指定每个分区的分割界线实现的。例如,假定我们有一个Customers表格,里面包含了企业所有的客户的信息,客户信息以唯一的客户号进行辨识,客户号从1到1000000。我们可以运用以下的分区函数(这里称之为customer_Partfunc)把这个表格平均分为四个分区:
  CREATE PARTITION FUNCTION customer_partfunc (int)
  AS RANGE RIGHT
  FOR VALUES (250000, 500000, 750000)
  这些分割界线指定了四个分区。第一个分区包含所有值小于250000的记录。第二个分区包含所有值在250000和499999之间的记录。而第三个分区包含所有值在500000和749999之间的记录。其他所有大于或等于750000的记录都包含在第四个分区里。
  注意这个例子中使用了“RANGE RIGHT”从句。这说明分界值是在分区的右边。同样,如果使用的是“RANGE LEFT”从句,那么第一个分区就会包含所有值小于或等于250000的记录;第二个分区就会包含所有值在250001和500000之间的记录,如此类推。
  第二个步骤:建立分区方案
  一旦建立完定义如何对数据进行分区的分区函数之后,下一步就是建立一个分区方案,定义where,即你想在哪里对数据进行分区。这是一个很直接明了的过程,例如,如果我有四个文件组,名称分别从“fg1”到“fg4”,那么就可以使用以下分区方案:
  CREATE PARTITION SCHEME customer_partscheme
  AS PARTITION customer_partfunc
  TO (fg1, fg2, fg3, fg4)
  注意我们现在把一个分区函数连接到了分区方案,但是我们还没有把分区方案连接到任何具体的数据库表格。这就是重复使用功能发挥功能的时候。我们可以通过这个功能把分区方案(或者只是分区函数)用于数据库表格的任何数据上。
  第三个步骤:对表格进行分区
  建立好分区方案之后,就可以开始对表格进行分区了。这是最简单的一个步骤,只需要在表格创建语句中添加“ON”从句,指定表格分区方案和要应用该分区方案的表列。你不需要指定分区函数,因为分区方案已经定义了分区函数。
  举个例子,假设你想要用上述的分区方案来创建一个客户表格,你需要使用以下Transact-SQL语句:
  CREATE TABLE customers (FirstName nvarchar(40), LastName nvarchar(40), CustomerNumber int)
  ON customer_partscheme (CustomerNumber)

zzxap 2009-02-25
  • 打赏
  • 举报
回复
[code=SQL]
----语句一
Declare @TargetPartitionNum int
Declare @Month int
Declare @YearMonth varchar(10)
set @Month = 1
Create Table #TempA(AgencyId int,OfficeId int,ClientId int,ProductId int,CampaignId Int,MediaId INT,WeeklyStartDate varchar(10),
RateCardCost DECIMAL(18,4),MediaCost DECIMAL(18,4),MarketCost DECIMAL(18,4),nettcost DECIMAL(18,4))

---Group By MediaSpotPlanDetail
While (@Month <=12)
Begin
set @YearMonth = Convert(nvarchar(10),2006*100 + @Month)
inSERT INTO #TempA
select AgencyId,OfficeID,ClientID,ProductId,ObjCampaignId as CampaignId,MediaId,WeeklyStartDate,
sum(RateCardCost) as RateCardCost,sum(MediaCost) as MediaCost,sum(MarketCost) as MarketCost,sum(nettcost) as nettcost
From MediaSpotPlanDetail_Partition
Where YearMonth = @YearMonth
Group by AgencyId,OfficeID,ProductId,MediaId,WeeklyStartDate,ClientID,ObjCampaignId set @Month = @Month + 1
end

---语句二
Create Table #TempA(AgencyId int,OfficeId int,ClientId int,ProductId int,CampaignId Int,MediaId INT,WeeklyStartDate varchar(10),
RateCardCost DECIMAL(18,4),MediaCost DECIMAL(18,4),MarketCost DECIMAL(18,4),nettcost DECIMAL(18,4))
inSERT INTO #TempA
select AgencyId,OfficeID,ClientID,ProductId,ObjCampaignId as CampaignId,MediaId,WeeklyStartDate,
sum(RateCardCost) as RateCardCost,sum(MediaCost) as MediaCost,sum(MarketCost) as MarketCost,sum(nettcost) as nettcost
From MediaSpotPlanDetail_Partition
Where YearMonth > = '200601 ' and YearMonth <= '200612 '
Group by AgencyId,OfficeID,ProductId,MediaId,WeeklyStartDate,ClientID,ObjCampaignId


[/CODE]
zzxap 2009-02-25
  • 打赏
  • 举报
回复
CREATE TABLE "SYSTEM"."AAA"("A" VARCHAR2(10), "B" VARCHAR2(10)) PARTITION BY RANGE (B,A) (PARTITION "AAAB" VALUES LESS THAN (MAXVALUE,MAXVALUE) TABLESPACE "TEMP" )

创建表SYSTEM.AAA
表分区名称AAAB
列B,A存储值小于MAXVALUE,MAXVALUE
表空间TEMP
rimm2008 2009-02-12
  • 打赏
  • 举报
回复
简要流程:
1. 计划一下分区法则,根据日期?地方?产品?人员?
a. 搜集 rowcount
b. 计划 filegroup 并新增
c. 计划新增数据档案的大小、位置等

就假设依日期分区,table name = mytable, primary key = id, 日期字段 = date_column

-- Step 1
Create partition function pf_year (data type) as range left for values ('2007-12/31', '2008-12-31')
-- Step 2
Create partition scheme ps_year as partition pf_year to (FG1, FG2, FG3)
-- Step 3
alter table mytable drop constraint pk_key with (move to ps_year(date_column))
-- Step 4
alter table mytable add constraint pk_key primary key clustered(id,date_column)

zhuxianzhu 2009-02-09
  • 打赏
  • 举报
回复
还是不是很懂分区
oraclelogan 2009-02-06
  • 打赏
  • 举报
回复
[Quote=引用楼主 zhuxianzhu 的帖子:]
怎样建立分区表加快查询速度?
有一个表有1200万数据,都是按年份存放的
我想把表按年份分割成几个区

请问怎样实现,分好区后又怎样查询?
[/Quote]

http://blog.tom.com/silingshengren/article/1323.html

http://www.databasejournal.com/features/mssql/article.php/3640891/Data-Partitioning-in-SQL-Server-2005---Part-II.htm
you_tube 2009-02-05
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 tippointGmail 的回复:]
有一个疑问,如果建立了比如abc3个分区表,但是这3个分区表都是在一个物理硬盘上,那能提升多少呢,因为物理磁头还是轮询查找,如果是多块硬盘,分区表建立在不同的硬盘上,这样速度才能很好的提升,不知道我这样的理解对不对。
[/Quote]
IO
tippointGmail 2009-02-05
  • 打赏
  • 举报
回复
有一个疑问,如果建立了比如abc3个分区表,但是这3个分区表都是在一个物理硬盘上,那能提升多少呢,因为物理磁头还是轮询查找,如果是多块硬盘,分区表建立在不同的硬盘上,这样速度才能很好的提升,不知道我这样的理解对不对。
claro 2009-02-05
  • 打赏
  • 举报
回复
帮顶
hery2002 2009-02-05
  • 打赏
  • 举报
回复
创建已分区表和已分区索引
http://technet.microsoft.com/zh-cn/library/ms188730(SQL.90).aspx
zhuxianzhu 2009-02-05
  • 打赏
  • 举报
回复
怎样建立分区表啊,我不懂
hery2002 2009-02-05
  • 打赏
  • 举报
回复
你自己都说了,
按照年来分区,建立已分区表(PS: SQL 2005版本以上)
直接按照联机丛书上的例子来写就是了.
分区后的查询和分区前的查询是一回事.

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧