欢迎投稿

今日深度:

关于数据库分区后的几个查询和补充,数据库分

关于数据库分区后的几个查询和补充,数据库分区几个查询


--查看分区及分区范围的情况
select * from sys.partitions where object_id = object_id('SecureUsbLog');
select * from sys.partition_range_values;


--查看分区架构情况
select * from sys.partition_schemes;


--查看某一特定分区列值属于哪个分区
select M2.$partition.Part_mediasec_func('20150325') as partition_num;


--查看某一特定分区的记录
select * from SecureUsbLog where M2.$partition.Part_mediasec_func(logTime) = 3


--查看各分区所包含的记录数
select $partition.Part_mediasec_func(logTime) as partition_num,
count(*) as record_num
from SecureUsbLog 
group by $partition.Part_mediasec_func(logTime)
order by $partition.Part_mediasec_func(logTime);

这部分是为了以后扩展,比如以后分区不够的时候,可以手动的添加分区。

--添加文件组
alter database M2
add filegroup [FG10];
go
--文件组
alter database M2
add file(name=FG10_data,filename='c:\esafenet\FG10_data.ndf',size=1MB) to filegroup[FG10];
--添加分区,以后扩展
USE M2    
GO    
ALTER PARTITION SCHEME Part_mediasec_scheme NEXT USED FG10    
ALTER PARTITION FUNCTION Part_mediasec_func() SPLIT RANGE ('20221231 23:59:59') 
GO

数据库日志这块,分区是一个很好的选择,如果不分区,还有一个方法就是日志分表,按月将每个月的数据放到不同的表中。

总之日志这块分区是一个很好的选择,但也不是唯一的选择,还有一个就是syslog。什么是syslog?

下集我再分享。



sql分区后怎提高查询效率?

你可能没有理解分区的目的。
如果只是纯粹的为了 分区而分区。那就没什么意义了。

首先。看了一下你的分区方式,总体上是没太大问题的。

如果不分区
那么当执行
SELECT * FROM tbl1 WHERE tbl = '2009-12-31'
的时候。
数据库需要从一个很大的索引里面去检索数据 (包含08年--11年 600W行)

如果分区了。
那么当执行
SELECT * FROM tbl WHERE tbl = '2009-12-31'
的时候。
数据库仅仅需要从一个较小的索引里面去检索数据 (09年 100W行)

举个简单的例子来说,也就是:
如果不分区,好比大海捞针的话。
那么分区了,好比从某条河里面捞针。

注意:如果查询的条件,不包含分区条件。
就好比要从河里面捞针,但是具体哪条河不知道,要每一条河都去捞一遍
(这就是 “如果跨区反而更慢 ” )

=================

下面再来看看 你的查询两年的数据的 SQL。

select * from tbl where tm between '2009-01-01' and '2010-01-01'
select * from tbl1 where tm between '2009-01-01' and '2010-01-01'

你这2个SQL,基本上数据库在分析完毕以后,要看索引的类型。
理论上是不使用非聚集索引的。
如果有聚集索引,那么采用聚集索引,没有的话,就直接全表扫描的。

对于分区的表
数据库顶多可以分析到,本次检索,可以不去检索 08年的分区与 11年的分区。
但是要去全部检索 09年的分区 与 10年的分区。

对于未分区的表
前面已说明,具体查询策略取决于索引类型。
 

数据库表分区优化

对SQL Server数据表进行分区的过程分为三个步骤:

  1)建立分区函数

  2)建立分区方案

  3)对表格进行分区

  第一个步骤:建立分区函数

  分区函数定义[u]how[/u],即你想要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之间的记录,如此类推。

  第二个步骤:建立分区方案

  一旦建立完定义如何对数据进行分区的分区函数之后,下一步就是建立一个分区方案,定义[u]where[/u],即你想在哪里对数据进行分区。这是一个很直接明了的过程,例如,如果我有四个文件组,名称分别从“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)...余下全文>>
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2443.html NewsArticle 关于数据库分区后的几个查询和补充,数据库分区几个查询 --查看分区及分区范围的情况select * from sys.partitions where object_id = object_id('SecureUsbLog');select * from sys.partition_range_values;--查看分...
评论暂时关闭