程序员人生 网站导航

Sql Server事物、索引、视图

栏目:互联网时间:2014-11-26 08:35:31

事务概念:
事务是1种机制,它包括了1组http://www.wfuyu.com/db/操作命令,而且将所有的命令作为1个整体向http://www.wfuyu.com/db/提交或撤消。
这组命令要末履行,要末都不履行,所以事务是1个不可分割的逻辑工作单元。

事务的特点:
1、原子性:事务作为1个完全性的操作,其各元素是不可分割的,要末全部履行,要末撤消所有的操作,事务的单元不可能出现部份成功的情况。
2、1致性:事务完成前后,数据必须保持完全1致的状态。即在事务开始或完成后,http://www.wfuyu.com/db/中存储的数据都必须保持1致的状态。
3、隔离性:事务是相对独立的,在1个事务对数据进行修改时,其他的事务变不可能修改。
4、持久性: 事务完成后,其对系统的影响是永久的。即1个事务如果提交成功,DBMS保证它对http://www.wfuyu.com/db/中数据的改变是永久性的,不会受任何系统故障的影响。

在T-SQL总是用以下语法来管理事务:
1、开始事务:BEGIN TRANSACTION
2、提交事物:COMMIT TRANSACTION
3、回滚事务:ROLLBACK TRANSACTION

索引可分为3类:
1、唯1索引:不允许有两行相同的索引值,所以唯1索引1般在主键或创建了唯1束缚的列上创建。当在列上创建了唯1束缚后,
将自动在此列创建1个唯1索引。
2、聚集索引:聚集索引根据数据行的键值在表或视图中排列和存储这些数据行,即表中行的物理顺序与索引顺序相同。每一个表只能有1个
聚集索引,由于数据行本身只能按1个顺序排序。如果表具有聚集索引,则该表称为聚集表,表中的数据行按索引顺序进行排序,如果
没有聚集索引,则其数据行存储在1个称为堆的无序结构中。
3、非聚集索引:非聚集索引具有独立于数据行的结构。非聚集索引包括非聚集索引键值,且每一个键值都有指向包括该键值的数据行的指针。

使用T-SQL创建索引
语法:
CREATE [UNIQUE] [CLUSTERED|NOCLUSTERED] INDEX indexname ON tablename
(字段名)
[WITH FILLFACTOR=x]
语法说明:UNIQUE指定创建的是唯1索引,可选项CLUSTERED、NOCLUSTERED指定是聚集索引还是非聚集索引,可选项indexname表示索引名,
索引的命名规范是“ix_表名称_列名”。FILLFACTOR表示填充因子,用于设置索引页数据填充的空间百分比,即每一个索引页的剩余空间。指定范围是
0~100,假设取值为70%,则表示还有30%的空间供以后扩大使用。0同等于100,表示页级别几近已填满,但留出了1些空间,最少能在添加1个索引行。
示例以下:
USE Bank
GO
if exists(select name from sysindexes where name='index_card_no')
BEGIN
drop index ALL_PURPOSE_CARD.index_card_no
END
create nonclustered index index_card_no on ALL_PURPOSE_CARD
(CARD_NO) with fillfactor=30
GO
如上示例使用exists子查询从系统视图sysindex中检查名为index_card_no的索引是不是存在。如果存在,则使用drop index语句删除,然后再表ALL_PURPOSE_CARD的
CARD_NO列上创建非聚集索引。1般而言,创建索引后,不需要在查询时显示指定根据那个索引进行查询,由于http://www.wfuyu.com/db/引擎会自动对查询进行优化。
利用索引进行查询:
select * from ALL_PURPOSE_CARD with(index=index_card_no) where LAST_USED_DATE between '2011-07-01'and'2012⑴2⑶0'
若存在多个索引可使用WITH(INDEX=索引名)显示指定索引进行查询
*提示:使用索引可以加快数据检索速度,但没有必要为每一个列都要创建索引,由于索引本身也需要保护
可以根据以下标准选择创建索引:1、该列用于频繁搜索;2、该列用于对数据进行排序;3、该列中重复值少。
下面的列不合适建立索引:1、列中重复值多;2、标中数据少(为小型的表建立索引是没必要要的,由于检索索引的时间可能比检索索引的时间还要长);3、频繁进行
插入操作的列(由于每次新添加了数据,索引都需要重新保护)。

视图:视图是1种虚拟表,其内容由查询定义。
使用T-SQL语句创建视图
语法:CREEATE VIEW viewname AS <select 语句>
示例:
USE Bank
GO
if exists(select * from sysobjects where name='view_credit_detail')
drop view_credit_detail
GO
create view view_credit_detail
AS SELECT ACCOUNT.ACCOUNT_NAME, CREDIT_CARD.CREDIT_CARD_NO, EXCHANGE.LOAN,EXCHANGE.EXTIME,EXCHANGE.EXADDRESS,EXCHANGE.PAY_MONTH
FROM ACCOUNT INNER JOIN CREDIT_CARD
ON ACCOUNT.ACCOUNT_ID=CREDIT_CARD.ACCOUNT_ID INNER JOIN EXCHANGE
ON CREDIT_CARD.CREDIT_CARD_ID=EXCHANGE.CREDIT_CARD_ID
GO
以上代码表示,如果在系统视图sysobject中已存在要创建的视图对象,
则需要先删除再创建。


 

------分隔线----------------------------
------分隔线----------------------------

最新技术推荐