⑴ 如何创建sql Server 2005表分区
创建一个分区表首先要定义你用来映射表内分区的分区函数。在下面定义的分区函数中,我将使用三个分区,每个分区对应于SalesHistoryArchive表中的每一种产品类型,这个表将在稍后定义。基本上,这些分区会把SalesHistoryArchive档案表划分成三个不同的表,它们由SQL Server自动维护。CREATE PARTITION FUNCTION [pf_Proct_Partition](VARCHAR(10)) AS RANGE LEFTFOR VALUES (N'BigScreen', N'Computer', N'PoolTable')定义函数的范围决定分区值属于哪一个边界。RNAGE LEFT:指定分区值将小于或等于在分区函数中定义的值。在上面使用的分区函数中一共建立了四个分区。所有名称小于或等于‘BigScreen’的产品将映射到第一个分区。任何名称大于‘BigScreen’但小于或等于‘Computer’的产品将映射到第二个分区;诸如此类。RANGE RIGHT:指定分区值将小于在分区函数中定义的值。在上面使用的分区函数中一共建立了四个分区。所有名称小于‘BigScreen’的产品将映射到第一个分区。任何名称大于或等于‘BigScreen’但小于或等于‘Computer’的产品将映射到第二个分区;诸如此类。建好分区函数后,现在我需要建立分区方案。我将把例子中的所有分区都映射到主文件组中。如果我希望将分区映射到不同的文件组,我会按文件组列表的顺序加入文件组名称。下面是创建分区方案的代码:CREATE PARTITION SCHEME [ps_Proct_Scheme] AS PARTITION[pf_Proct_Partition]ALL TO ([PRIMARY])现在我建立需要分区的表,我可以创建SalesHistoryArchive表并在其中加载数据。在CREATE TABLE语句末尾,分区方案使用表中的一个字段名告诉SQL Server如何映射需要分区的表中的数据。查看列表A中的代码样本。我需要对数据进行一些查询,保证分区正常运行。下面的查询返回SalesHistoryArchive表的所有行,并使用$partition函数指出返回的行属于哪个分区:SELECT $partition.[pf_Proct_Partition](Proct), *FROM SalesHistoryArchive这个查询返回所有映射到SalesHistoryArchive表中的分区:SELECT * From sys.partitionsWHERE OBJECT_NAME(object_id) = 'SalesHistoryArchive'接下来…在后面的文章中,我将解释如何修改表中的这些分区,从而在其中增加新数据,并非常高效地删除旧数据。
⑵ 如何创建、使用sql分区视图
分区视图:分区视图是通过对成员表使用union all所定义的视图
这些成员的结构相同,一般情况下,为分区视图具有如下语法:
create view vie_name
with schemabinding
as
select <select_list1>
from t1
union all
select <select_list2>
from t2
union all
..
select <select_listn>
from tn
分区视图的作用:用在一台或多台服务器水平连接一组成员表中的分区数据
使数据看起来就像来自一个表
⑶ SQL语句如何查询分区键
如果表 PartitionTable
已分区,以下查询将返回一个或多个行。
如果表未分区,则不返回任何行。
SELECT * FROM sys.partitions AS p
JOIN sys.tables AS t
ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
AND t.name = 'PartitionTable';
以下查询返回表的分区列的名称。
PartitionTable.
SELECT t.object_id AS Object_ID, t.name AS TableName, ic.column_id as PartitioningColumnID, c.name AS PartitioningColumnName
FROM sys.tables AS t
JOIN sys.indexes AS i
ON t.object_id = i.object_id
JOIN sys.columns AS c
ON t.object_id = c.object_id
JOIN sys.partition_schemes AS ps
ON ps.data_space_id = i.data_space_id
JOIN sys.index_columns AS ic
ON ic.object_id = i.object_id AND ic.index_id = i.index_id AND ic.partition_ordinal > 0
WHERE t.name = 'PartitionTable'
AND i.type <= 1
AND c.column_id = 1;
⑷ SQL server PARTITION BY 是什么意思
很高兴为你解答, 相信group by你一定用过吧, 先对比说下
partition by关键字是oracle中分析性函数的一部分,它和聚合函数不同的地方在于它能返回一个分组中的多条记录,而聚合函数一般只有一条反映统计值的记录,partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组,它有一部分函数既是聚合函数也是分析函数,比如avg、max,也有一部分是特有的,比如first、rank,除了order by子句外,分析函数在一个查询中优先级最低。至于partition by和group by谁的性能更好,要看具体情况而定,partition by的作用仅用于分组,那么性能可能比不上group by
希望能有帮助
⑸ 如何对一个已经存在的SQL Server表分区
有两种方法可以实现对一个表分区.一是创建一个新的标识为分区表的表(你可参照此步骤),然后把数据复制到这张新表,再对这两张表分别改名.或者,像我写在下面的,通过重建或创建一个聚集索引来达到分区一个表.
一个SQL Server表和数据进行分区示例
--Table/Index creation
CREATE TABLE [dbo].[TABLE1]
([pkcol] [int] NOT NULL,
[datacol1] [int] NULL,
[datacol2] [int] NULL,
[datacol3] [varchar](50) NULL,
[partitioncol] datetime)
GO
ALTER TABLE dbo.TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY CLUSTERED (pkcol)
GO
CREATE NONCLUSTERED INDEX IX_TABLE1_col2col3 ON dbo.TABLE1 (datacol1,datacol2)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
GO
-- Populate table data
DECLARE @val INT
SELECT @val=1
WHILE @val < 1000
BEGIN
INSERT INTO dbo.Table1(pkcol, datacol1, datacol2, datacol3, partitioncol)
VALUES (@val,@val,@val,'TEST',getdate()-@val)
SELECT @val=@val+1
END
GO
通过查看sys.partitions系统视图,上面的代码创建了一个传统的单分区表.
SELECT o.name objectname,i.name indexname, partition_id, partition_number, [rows]
FROM sys.partitions p
INNER JOIN sys.objects o ON o.object_id=p.object_id
INNER JOIN sys.indexes i ON i.object_id=p.object_id and p.index_id=i.index_id
WHERE o.name LIKE '%TABLE1%'
objectname
indexname
partition_id
partition_number
rows
TABLE1 PK_TABLE1 72057594042712064 1 999
TABLE1 IX_TABLE1_col2col3 72057594042777600 1 999
创建已分区的SQL Server表
为了创建一个分区表,需要先创建一个分区函数和分区方案. 下面的示例中,将通过datatime字段对一个表分区. 这里是创建这些对象与在系统视图中查看这些元数据的代码.
CREATE PARTITION FUNCTION myDateRangePF (datetime)
AS RANGE RIGHT FOR VALUES ('20110101', '20120101','20130101')
GO
CREATE PARTITION SCHEME myPartitionScheme
AS PARTITION myDateRangePF ALL TO ([PRIMARY])
GO
SELECT ps.name,pf.name,boundary_id,value
FROM sys.partition_schemes ps
INNER JOIN sys.partition_functions pf ON pf.function_id=ps.function_id
INNER JOIN sys.partition_range_values prf ON pf.function_id=prf.function_id
现在我们有一个分区方案,可对表进行分区操作. 既然我们想通过聚集索引来对一个创建了聚集索引的表进行分区,我们需要先删除掉这个索引并通过一个非聚集索引重建这个约束. 若这张表没有聚集索引,我们可忽略这一步,直接执行创建聚集索引语句. 类似地,若有一个聚集索引创建在分区字段上,我们可执行带DROP_EXISTING的创建聚集索引语句. 最后,若关注于执行此任务时数据库停止服务时间并且你使用的是SQL Server企业版本,可通过创建索引的ONLINE=ON选项来使数据库的停止服务时间最小. 记住,在使用ONLINE选项重建索引时,你可能会看到一些性能降低的现象. 这里是一些可能会乃至的脚本.
ALTER TABLE dbo.TABLE1 DROP CONSTRAINT PK_TABLE1
GO
ALTER TABLE dbo.TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY NONCLUSTERED (pkcol)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE CLUSTERED INDEX IX_TABLE1_partitioncol ON dbo.TABLE1 (partitioncol)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON myPartitionScheme(partitioncol)
GO
在这些语句结束后,我们可再次查看sys.partitions系统视图(看上面的代码)并确认我们的表有4个分区.
objectname
indexname
partition_id
partition_number
rows
TABLE1 IX_TABLE1_partitioncol 72057594043039744 1 233
TABLE1 IX_TABLE1_partitioncol 72057594043105280 2 365
TABLE1 IX_TABLE1_partitioncol 72057594043170816 3 366
TABLE1 IX_TABLE1_partitioncol 72057594043236352 4 35
TABLE1 IX_TABLE1_col2col3 72057594043301888 1 999
TABLE1 PK_TABLE1 72057594043367424 1 999
SQL Server表和数据示例清除
--cleanup
DROP TABLE TABLE1
DROP PARTITION SCHEME myPartitionScheme
DROP PARTITION FUNCTION myDateRangePF
⑹ sql 超多数据怎么分区好点
这样的项目少于百万级别,就别做了,这百万还只是硬件的上的投入。这几天经常看到你问类似的问题。说实话,这样的性能要求,若纯靠技术手段实现。俺只能呵呵呵了
⑺ mysql数据库partition分区的sql怎么写
sql语句和平常一样,不用指定分区查,以前怎么写,分区后还怎么写,mysql自动查找分区里的数据。
⑻ SQL 语法速成手册(干货满满,建议收藏!)
SQL 语法结构包括:
例如: SELECT 与 select 、 Select 是相同的。
数据定义语言(Data Definition Language,DDL)是 SQL 语言集中负责数据结构定义与数据库对象定义的语言。
DDL 的主要功能是 定义数据库对象 。
DDL 的核心指令是 CREATE 、 ALTER 、 DROP 。
数据操纵语言(Data Manipulation Language, DML)是用于数据库操作,对数据库其中的对象和数据运行访问工作的编程语句。
DML 的主要功能是 访问数据 ,因此其语法都是以 读写数据库 为主。
DML 的核心指令是 INSERT 、 UPDATE 、 DELETE 、 SELECT 。这四个指令合称 CRUD(Create, Read, Update, Delete),即增删改查。
事务控制语言 (Transaction Control Language, TCL) 用于 管理数据库中的事务 。这些用于管理由 DML 语句所做的更改。它还允许将语句分组为逻辑事务。
TCL 的核心指令是 COMMIT 、 ROLLBACK 。
数据控制语言 (Data Control Language, DCL) 是一种可对数据访问权进行控制的指令,它可以控制特定用户账户对数据表、查看表、预存程序、用户自定义函数等数据库对象的控制权。
DCL 的核心指令是 GRANT 、 REVOKE 。
DCL 以 控制用户的访问权限 为主,因此其指令作法并不复杂,可利用 DCL 控制的权限有: CONNECT 、 SELECT 、 INSERT 、 UPDATE 、 DELETE 、 EXECUTE 、 USAGE 、 REFERENCES 。
根据不同的 DBMS 以及不同的安全性实体,其支持的权限控制也有所不同。
(以下为 DML 语句用法)
插入完整的行
插入行的一部分
插入查询出来的数据
删除表中的指定数据
清空表中的数据
查询单列
查询多列
查询所有列
查询不同的值
限制查询结果
子查询的子查询
SELECT 语句中的 WHERE 子句
UPDATE 语句中的 WHERE 子句
DELETE 语句中的 WHERE 子句
IN 示例
BETWEEN 示例
AND 示例
OR 示例
NOT 示例
% 示例
_ 示例
组合查询
其中, SOUNDEX() 可以将一个字符串转换为描述其语音表示的字母数字模式。
AVG() 会忽略 NULL 行。
使用 DISTINCT 可以让汇总函数值汇总不同的值。
指定多个列的排序方向
分组
分组后排序
使用 WHERE 和 HAVING 过滤数据
(以下为 DDL 语句用法)
普通创建
根据已有的表创建新表
添加列
删除列
修改列
添加主键
删除主键
创建表时使用约束条件:
(以下为 TCL 语句用法)
(以下为 DCL 语句用法)
可以使用触发器来进行审计跟踪,把修改记录到另外一张表中。
MySQL 不允许在触发器中使用 CALL 语句 ,也就是不能调用存储过程。
BEGIN 和 END
当触发器的触发条件满足时,将会执行 BEGIN 和 END 之间的触发器执行动作。
NEW 和 OLD
CREATE TRIGGER 指令用于创建触发器。
语法:
说明:
示例:
⑼ 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语句
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。
在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。
二、SQL语句编写注意问题
下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。
1.
IS
NULL
与
IS
NOT
NULL
不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。
任何在where子句中使用is
null或is
not
null的语句优化器是不允许使用索引的。
2.
联接列
对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill
Cliton)的职工。
下面是一个采用联接查询的SQL语句,
select
*
from
employss
where
first_name||''||last_name
='Beill
Cliton';
上面这条语句完全可以查询出是否有Bill
Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。
当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。
***
where
first_name
='Beill'
and
last_name
='Cliton';
.
带通配符(%)的like语句
同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:
select
*
from
employee
where
last_name
like
'%cliton%';
这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:
select
*
from
employee
where
last_name
like
'c%';
4.
Order
by语句
ORDER
BY语句决定了Oracle如何将返回的查询结果排序。Order
by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order
by语句的非索引项或者有计算表达式都将降低查询速度。
仔细检查order
by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order
by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order
by子句中使用表达式。
5.
NOT
我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:
...
where
not
(status
='VALID')
如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:
...
where
status
<>'INVALID';
对这个查询,可以改写为不使用NOT:
select
*
from
employee
where
salary<3000
or
salary>3000;
虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。
虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。