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

2014-11-24 13:29:16 · 作者: · 浏览: 13
ID=OBJECT_ID('dbo.MyPersons')
SELECT index_id,avg_gragmentation_in_percent,avg_page_space_used_in_percent FROM sys.dm_db_index_physical_stats(@DbID,@ObjectID,NULL,NULL,'DETAILED') WHERE index_level=0
  为减少页拆分产生的碎片,数据库管理员可以设计或重新生成索引,使数据页不会完全填充。为此,可以使用填充因此,当建立或重新生成索引时,可以指定填充因子百分比,如果一个索引页只有90%被填充,那么只有插入更多的索引时才会导致页拆分,虽因产生碎片的时间会久些。个人认为,索引的填充因子最好不要低于90%,在更新和查询都很频繁的表上,这个比例可以低至85%。
  要去除碎片可以有三种方法:删除并重新生成索引、原地重新生成索引或重新组织索引。
--使用DROP_EXISTING选项创建索引
CREATE UNIQUE CLUSTERED INDEX PK_Address_AddressID ON Person.Address(AddressID) WITH (fillfactor=90,DROP_EXISTING=ON)
--重新生成索引
USE AdventureWorks2008
GO
ALTER INDEX AK_Product_ProductNumber ON Person.Product REBUILD WITH (FILLFACTOR=90,ONLINE=ON)
USE AdventureWorks2008
GO
ALTER INDEX ALL ON Person.Product REBUILD WITH (FILLFACTOR=90,ONLINE=ON)
  重新组织索引消耗的系统资源最少,但不如重新生成索引来的彻底。
强制数据完整性
  主键约束:一个表有且只能有一个主键约束。它用来唯一标识表中的每一行。主键约束可定义在单个列或者列组合上。SQL Server使用方法是在参与主键的列上创建唯一的索引。在不排序的情况下来强制唯一性会非常低效。SQL Server这方面的问题是,如果聚集索引不存在,他会默认一个唯一的聚集索引。决定什么列参与主键和决定什么列定义表数据的物理结构是完全不同的。不应假定一个主键同时也是表的聚集键。记住,表的所有聚集索引将包含聚集索引键作为指向数据行的指针。如果主键很长,使用聚集索引支持主键对于非聚集索引的存储和检索是非常不利的。
USER AdventureWorks2008
GO
CREATE TABLE dbo.CreditCards(
CreditCardID int IDENTITY(1,1) NOT NULL CONSTRAINT PK_CreditCardID PRIMARY KEY NONCLUSTERED (CreditCardID),
CardType nvarchar(50) NOT NULL,
CardNumber nvarchar(25) NOT NULL,
ExpMonth tinyint NOT NULL,
ExpYear smallint NOT NULL,
ModifiedDate datetime NOT NULL
)
USER AdventureWorks2008
GO
CREATE TABLE dbo.CreditCards(
CreditCardID int IDENTITY(1,1) NOT NULL,
CardType nvarchar(50) NOT NULL,
CardNumber nvarchar(25) NOT NULL,
ExpMonth tinyint NOT NULL,
ExpYear smallint NOT NULL,
ModifiedDate datetime NOT NULL,
CONSTRAINT PK_CreditCardID PRIMARY KEY NONCLUSTERED (CreditCardID))
ALTER TABLE dbo.CreditCards
ADD CONSTRAINT PK_CreditCardID PRIMARY KEY NONCLUSTERED (CreditCardID)
  唯一约束:虽然一个表只能有一个主键约束,但是它可以有很多唯一约束。要创建唯一约束,有两个选择,在表上创建唯一索引或唯一约束。唯一索引和唯一约束的行为相似,而SQL Server将创建唯一索引来强制唯一约束。
ALTER TABLE dbo.Driver
ADD CONSTRAINT UX_LincenseNum UNIQUE NONCLUSTERED(LicenseNum)
CREATE UNIQUE NONCLUSTERED INDEX INDEX UX_LincenseNum ON dbo.Driver(LicenseNum)
  外键约束:外键约束用来保证表之间的完整性,要在表上创建一个外键约束,定义在外键中的列必须映射到主键表中的列,这些列被指定为主键或者有唯一约束(唯一约束和唯一索引都可以)。外键约束有一些高级选项,他们可以在创建中和创建后改变外键约束的行为。
--WITH CHECK添加外键约束时的默认设置,设置指定了应对外键表中任何现有数据进行验证
ALTER TABLE dbo.DriverRecord WITH CHECK
ADD CONSTRAINT FK_DriverRecord_Driver FOREIGN KEY (DriverID) REFERENCES dbo.Driver (DriverID)
--WITH NOCHECK,设定了部队现有数据进行验证来使其符合新的约束
ALTER TABLE dbo.DriverRecord WITH NOCHECK
ADD CONSTRAINT FK_DriverRecord_Driver FOREIGN KEY (DriverID) REFERENCES dbo.Driver (DriverID)
  级联约束:外键默认组织更新或删除父值,然而有些时候这种行为并不合适。SQL Server提供了指定在福记录被删除或更新的情况下对子记录采取何种行为的选项。ON DELETE NO ACTION和ON UPDATE NO ACTION是外键的默认设置。这些设定指定,任何试图删除或更新由其他表中现有行的外键所引用的键值的行为都会失败。此外还有CASCADE,SET NULL和SET DEFAULT选项,他们允许删除或更新键值,以定义的方式级联至定义为拥有外键关系的表
--ON DELETE CASCADE如果父行被删除,子记录也删除
ALTER TABLE dbo.DriverRecord WITH NOCHECK
ADD CONSTRAINT FK_DriverRecord_Driver FOREIGN KEY (DriverID) REFERENCES dbo.Driver (DriverID) ON DELETE CASCADE
--ON UPDATE CASCADE如果父键被更新,子记录也更新
ALTER TABLE dbo.DriverRecord WITH NOCHECK
ADD CONSTRAINT F