SQL Server 2008数据库创建过程和可配置选项(四)

2014-11-24 13:29:16 · 作者: · 浏览: 1

CREATE TABLE dbo.Transactions(
TransactionID int NOT NULL,
ProductID int NOT NULL,
ReferenceOrderID int NOT NULL,
ReferenceOrderLineID int NOT NULL,
TransactionDate datetime NOT NULL,
TransactionType nchar(1) NOT NULL,
Quantity int NOT NULL,
ActualCost money NOT NULL,
ModifiedDate datetime NOT NULL
)
--填充新表
USE AdventureWorks2008
GO
INSERT dbo.Transactions
SELECT * FROM Production.TransactionHistory UNION ALL SELECT * FROM Production.TransactionHistoryArchive
--查看查询性能
USER AdventureWorks2008
GO
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
DECLARE @BeginDate AS datetime,@EndDate AS datetime
SET @BeginDate='2002-01-01'
SET @EndDate='2002-12-31'
SELECT SUM(Quantity) AS TotalQuantity,SUM(ActualCost) AS TotalCost FROM dbo.Transactions WHERE TransactionDate BETWEEN @BeginDate AND @EndDate
  可以看到,为了满足查询要求,SQL Server不得不扫描表,现在对表进行分区,把该物理划分为多个文件,使所有的事务按照年份分开,看看会发生什么情况:
--创建四个文件组
USER MASTER
GO
ALTER DATABASE AdventureWorks2008 ADD FILEGROUP FGPre2002
GO
ALTER DATABASE AdventureWorks2008 ADD FILE
(
NAME='AworksPre2002',
FILENAME='E:\SQLData\AworksPre2002.ndf',
SIZE=20MB,
FILEGROWTH=20%
) TO FILEGROUP FGPre2002
GO
ALTER DATABASE AdventureWorks2008 ADD FILEGROUP FG2002
GO
ALTER DATABASE AdventureWorks2008 ADD FILE
(
NAME='Aworks2002',
FILENAME='E:\SQLData\Aworks2002.ndf',
SIZE=20MB,
FILEGROWTH=20%
) TO FILEGROUP FG2002
GO
ALTER DATABASE AdventureWorks2008 ADD FILEGROUP FG2003
GO
ALTER DATABASE AdventureWorks2008 ADD FILE
(
NAME='Aworks2003',
FILENAME='E:\SQLData\Aworks2003.ndf',
SIZE=20MB,
FILEGROWTH=20%
) TO FILEGROUP FG2003
GO
ALTER DATABASE AdventureWorks2008 ADD FILEGROUP FG2004AndAfter
GO
ALTER DATABASE AdventureWorks2008 ADD FILE
(
NAME='Aworks2004AndAfter',
FILENAME='E:\SQLData\Aworks2004AndAfter.ndf',
SIZE=20MB,
FILEGROWTH=20%
) TO FILEGROUP FG2004AndAfter
GO
--创建分区函数
CREATE PARTITION FUNCTION YearFunction(datetime) AS RANGE RIGHT FOR VALUES('1/1/2002','1/1/2003','1/1/2004')
--将YearFunction创建的分区映射到之前创建的文件组
CREATE PARTITION SCHEME YearScheme
AS PARTITION YearFunction
TO (FGPre2002,FG2002,FG2003,FG2004AndAfter)
--将数据从原Transactions表中移至分区表中
USER AdventureWorks2008
GO
CREATE TABLE dbo.PartitionedTransactions(
TransactionID int NOT NULL,
ProductID int NOT NULL,
ReferenceOrderID int NOT NULL,
ReferenceOrderLineID int NOT NULL,
TransactionDate datetime NOT NULL,
TransactionType nchar(1) NOT NULL,
Quantity int NOT NULL,
ActualCost money NOT NULL,
ModifiedDate datetime NOT NULL
) ON YearScheme(TransactionDate)
GO

INSERT INTO dbo.PartitionedTransactions SELECT * FROM dbo.Transactions
--查询性能测试
USER AdventureWorks2008
GO
DBCC DROPCLEANBUFFERS
SET STATISTICS IO ON
DECLARE @BeginDate AS datetime,@EndDate AS datetime
SET @BeginDate='2002-01-01'
SET @EndDate='2002-12-31'
SELECT SUM(Quantity) AS TotalQuantity,SUM(ActualCost) AS TotalCost FROM dbo.PartitionedTransactions WHERE TransactionDate BETWEEN @BeginDate AND @EndDate
  创建表分区还可以通过右击表选择存储,选择创建分区,通过GUI进行创建,这里略掉
索引
  堆用来存储数据很好,也能有效地处理新纪录,但是要在表中寻找特定数据时就没有那么好用了。这就是索引发挥作用的地方那个。SQL Server支持两种类型的索引,聚集索引和非聚集索引。它还支持XML索引和空间索引等其他类型索引,这这些索引和普通索引的关系索引打不相同,后者将来用在 数据库表中定位大多数数据。聚集索引和非聚集索引之间的主要区别在于索引的叶级。在非聚集索引中,叶级包含数据的指针。在聚集索引中,叶级包含实际数据。
  聚集索引:表的所有数据可存储在堆中或聚集索引中,堆和聚集索引是相互排