索引
- 介绍
索引分为聚集索引和非聚集索引,数据库中的索引类似于一本书的目录,在一本书中通过目录可以快速找到你想要的信息,而不需要读完全书。
索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 。但是索引对于提高查询性能也不是万能的,也不是建立越多的索引就越好。
索引建少了,用 WHERE 子句找数据效率低,不利于查找数据。
索引建多了,不利于新增、修改和删除等操作,因为做这些操作时,SQL SERVER 除了要更新数据表本身,还要连带立即更新所有的相关索引,而且过多的索引也会浪费硬盘空间。
- 索引的分类
索引就类似于中文字典前面的目录,按照拼音或部首都可以很快的定位到所要查找的字。
1、唯一索引(UNIQUE):每一行的索引值都是唯一的(创建了唯一约束,系统将自动创建唯一索引)
2、主键索引:当创建表时指定的主键列,会自动创建主键索引,并且拥有唯一的特性。
3、聚集索引(CLUSTERED):聚集索引就相当于使用字典的拼音查找,因为聚集索引存储记录是物理上连续存在的,即拼音 a 过了后面肯定是 b 一样。
4、非聚集索引(NONCLUSTERED):非聚集索引就相当于使用字典的部首查找,非聚集索引是逻辑上的连续,物理存储并不连续。
PS:聚集索引一个表只能有一个(因为数据真实的物理存储顺序就是按照聚集索引存储的。),而非聚集索引一个表可以存在多个。
查看表中的索引: select * from sys.indexes where object_id = OBJECT_ID('表名');
问题:主键就是加了唯一性约束的聚集索引?
不对, 因为一般创建表时,主键的索引默认为聚集索引,但是我们可以手动改为非聚集索引【NONCLUSTERED 】的。
CREATE TABLE [dbo].[OrderExpertAmount]( [ID] [int] IDENTITY(1,1) NOT NULL, [OrderID] [int] NOT NULL, [Remark] [nvarchar](max) NULL, CONSTRAINT [PK_OrderExpertAmount] PRIMARY KEY CLUSTERED ( [ID] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]
我们可以对表执行以下语句,看报不报错。
创建聚集索引:CREATE CLUSTERED INDEX index_orderid ON OrderExpertAmount(OrderID);
参考:主键就是聚集索引吗?
实际上,让主键ID作为聚集索引是一种资源浪费,因为:ID号是自动生成的,我们并不知道每条记录的ID号,所以我们很难在实践中用ID号来进行查询。
更多参考:聚集索引和非聚集索引的区别有哪些
- 实例
-- 创建唯一聚集索引
create unique clustered --表示创建唯一聚集索引 index UQ_Clu_StuNo --索引名称 on Student(S_StuNo) --数据表名称(建立索引的列名)
PS:当 create index 时,如果未指定 clustered 和 nonclustered,那么默认为 nonclustered。
- 索引定义原则:
避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
在条件表达式中经常用到的、不同值较多的列上建立索引,在不同值少的列上不要建立索引。
在频繁进行排序或分组(即进行 GROUP BY 或 ORDER BY 操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
在选择索引键时,尽可能采用小数据类型的列作为键以使每个索引页能容纳尽可能多的索引键和指针,通过这种方式,可使一个查询必需遍历的索引页面降低到最小,此外,尽可能的使用整数做为键值,因为整数的访问速度最快。
- 索引可以优化SQL查询性能,在sql管理器中
1、查看耗时:工具里面第一个工具(sql server profiler),连接上远程的服务器,看每个查询耗费的时间(监测SQL语句执行的性能参数)。
2、在查询分析器中,运行一个查询,执行
3、切换到sql server profiler中,可以看到第2步sql语句具体的用时。
4、索引自建:切换到查询分析器,选中耗时的sql语句右键-》数据库引擎优化顾问中的分析查询-》登录-》开始分析-》
操作-》应用建议
索引导出:数据库右键-》任务-》生成脚本-》
视图
视图是一种虚拟表,来自一个或者多个表的行或者列,视图并不是数据库中存储的数据值,可以简单的理解视图就是封装了一段查询语句,调用该视图就得到查询语句查询出来的临时表。
创建视图:View_UWBandVIDEO
Create view View_UWBandVIDEO as SELECT dbo.INFO_PARKING_LOT.ID, dbo.VIDEO_HISTORY_CO.TIME, dbo.VIDEO_HISTORY_CO.FLAG, dbo.VIDEO_HISTORY_CO.PATH, dbo.VIDEO_HISTORY_CO.DEVICEID, dbo.INFO_PARKING_LOT.PARKINGNAME, dbo.INFO_PARKING_LOT.PARKINGID, dbo.INFO_PARKING_LOT.STATUS, dbo.INFO_PARKING_LOT.TIMEIN, dbo.INFO_PARKING_LOT.TIMEOUT, dbo.INFO_PARKING_LOT.PLATE, dbo.INFO_PARKING_LOT.OBUID FROM dbo.INFO_PARKING_LOT INNER JOIN dbo.VIDEO_HISTORY_CO ON dbo.INFO_PARKING_LOT.ID = dbo.VIDEO_HISTORY_CO.LOTID