千万级别数据表,单列索引和多列索引性能对比
由于Contact表存在多个(单列)索引,造成Delete ,update ,insert操作时需要花费大量的时间删除索引和重建索引.
通过把多个(单列)索引合并成一个(多列)索引后,测试得出Delete ,update ,insert操作时需要花费的时间大大缩短.
由于多个(单列)索引合并成一个(多列)索引,可能会对之前单列索引字段的查询性能有影响,做了对比测试.
下面连接有个详细的对比数据性能表:
写SQL语句的时候很多时候会用到filter筛选掉一些记录,SQL对筛选条件简称:SARG(search
argument/SARG)
复制代码
代码如下:
where
and
当然这里不是说SQLSERVER的where子句,是说SQLSERVER对索引的利用在SQLSERVER对于没有SARG运算符的表达式,索引是没有用的,SQLSERVER对它们很难使用比较优化的做法.
意思是说,如果你的SQL语句中没有where子句包括非SARG运算符,那么你的SQL语句是不会用到表格中的索引的
下面说一下哪些是非SARG运算符:
非SARG运算符包括
NOT、
、
NOT
EXISTS、
IN、
LIKE
规律就是有"NOT"
关键字
或者
不等于的意思
基本上利用不了索引
还有一些内部函数,如果使用这些内部函数SQLSERVER也不会用到索引
内部函数,例如:CONVERT(),UPPER()等
第一段:SQL创建索引的目的如下:
①.、通过唯一性索引(unique)可确保数据的唯一性;
第二段:创建SQL索引的语法:
CREATE [UNIQUE] [CLUSTERED| NONCLUSTERED](索引类型) INDEX 索引名 ON 表名(列名 [ASC|DESC] [, 列名[ASC|DESC]...]).
扩展资料:
索引的类别介绍:
①.、唯一索引:
唯一索引是不允许其中任何两行具有相同索引值的索引.当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存.数据库还可能防止添加将在表中创建重复键值的新数据.
数据库表经常有一列或多列组合,其值唯一标识表中的每一行.该列称为表的主键.在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型.该索引要求主键中的每个值都唯一.当在查询中使用主键索引时,它还允许对数据的快速访问.
操作 1、
创建聚集索引
方法 1、
alter table table_name add constraint cons_name priamry key(columnName ASC|DESC,[.....]) with (drop_existing = on);
alter table Employee
add constraint PK_for_Employee primary key clustered (ID);
go
这个是一种特别的方法,因为在定义主键的时候,会自动添加索引,好在加的是聚集索引还是非聚集索引是我们人为可以控制的.
通过sp_helpindex 可以查看表中的索引
execute sp_helpindex @objname = 'Employee';
这样一来,可从索引视图检索数据而无需重新编码,由此带来的高效率也使现有查询获益.在视图上创建的第一个索引必须是唯一聚集索引.在创建唯一聚集索引后,可创建其它非聚集索引.视图上的索引命名规则与表上的索引命名规则相同.唯一区别是表名由视图名替换.(Sql Server联机帮助)
语句:Create VIEW vXXX WITH SCHEMABINDING AS......
Create UNIQUE CLUSTERED INDEX idxXXX ON vXXX(cXXX)
一个标准视图转换为一个索引视图必须遵守以下规则:
A.视图必须使用With Schemabinding选项来创建;
如果创建视图时没有with Schemabinding,试图创建视图时就会报错:......因为该视图未绑定到架构
B.在这个视图中不能使用其他视图、导出表、行集函数或自查询,也就是说只能使用表;
C.视图所用到的基本表必须和视图属于同一个所有者;
D.视图只能链接同一个数据库中的表;
E.视图不能包含一个外部链接或自链接,也就是说在链接表时只能使用INNER JOIN并且INNER JOIN前后不能使同一个表,不能使用LEFT(RIGHT) JOIN 或者 LEFT (RIGHT) OUTER JOIN ;
F. 视图不能包含UNION子句、TOP子句、ORDER BY子句、Having子句、Rollup子句、Cube子句、compute子句、Compute By子句或Distinct关键字;
G. 视图不允许使用某些集合函数,如:Count(*)可以使用count_big(*)代替、avg()、max()、min()、stdev()、stdevp()、var()或varp()等;
H. 视图不能使用Select * 这样的语句,也就是说视图的所有字段都必须显示指定;
I. 视图不能包含Text、ntext、image类型的列;
J. 如果视图包含一个Group By子句,那么他必须在Select列中包含count_big(*);
K. 视图中的所有标和用户自定义的函数都必须使用两段式名来引用,即所有者.表或函数名称;
L. 所有的基本表和视图都必须使用 Set Ansi_Nulls On 创建;
M. 在创建索引时或创建索引后执行IUD时,必须显示或隐式地执行:
Set ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
SET ARITHABORT ON
SET CONCAT_NULL_YIELDS_NULL ON
SET QUOTED_IDENTIFIER ON
SET NUMERIC_ROUNDABORT OFF
各个选项的有关信息或意义,可以查阅SQL Server的联机丛书,这里就不再介绍了;
什么是索引
同理,SQL Server允许用户在表中创建索引,指定按某列预先排序,从而大大提高查询速度.
索引:是SQL Server编排数据的内部方法.它为SQL Server提供一种方法来编排查询数据.
索引页:数据库中存储索引的数据页;索引页类似于汉语字(词)典中按拼音或笔画排序的目录页.
索引的作用:通过使用索引,可以大大提高数据库的检索速度,改善数据库性能.
索引类型
唯一索引:唯一索引不允许两行具有相同的索引值
主键索引:为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型.主键索引要求主键中的每个值是唯一的,并且不能为空
聚集索引(Clustered):表中各行的物理顺序与键值的逻辑(索引)顺序相同,每个表只能有一个
索引类型:再次用汉语字典打比方,希望大家能够明白聚集索引和非聚集索引这两个概念.
唯一索引:
唯一索引不允许两行具有相同的索引值.
如果现有数据中存在重复的键值,则大多数数据库都不允许将新创建的唯一索引与表一起保存.当新数据将使表中的键值重复时,数据库也拒绝接受此数据.例如,如果在stuInfo表中的学员员身份证号(stuID) 列上创建了唯一索引,则所有学员的身份证号不能重复.
提示:创建了唯一约束,将自动创建唯一索引.尽管唯一索引有助于找到信息,但为了获得最佳性能,建议使用主键约束或唯一约束.
主键索引:
在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型.主键索引要求主键中的每个值是唯一的.当在查询中使用主键索引时,它还允许快速访问数据.
聚集索引(clustered index)
非聚集索引(Non-clustered)
提示:SQL Server中,一个表只能创建1个聚集索引,多个非聚集索引.设置某列为主键,该列就默认为聚集索引
如何创建索引
使用T-SQL语句创建索引的语法:
CREATE [UNIQUE] [CLUSTERED|NONCLUSTERED]
INDEX index_name
ON table_name (column_name...)
[WITH FILLFACTOR=x]
q UNIQUE表示唯一索引,可选
q CLUSTERED、NONCLUSTERED表示聚集索引还是非聚集索引,可选
q FILLFACTOR表示填充因子,指定一个0到100之间的值,该值指示索引页填满的空间所占的百分比
在stuMarks表的writtenExam列创建索引:
USE stuDB
GO
IF EXISTS (SELECT name FROM sysindexes
WHERE name = 'IX_writtenExam')
DROP INDEX stuMarks.IX_writtenExam
CREATE NONCLUSTERED INDEX IX_writtenExam
ON stuMarks(writtenExam)
/*-----指定按索引 IX_writtenExam 查询----*/
SELECT * FROM stuMarks (INDEX=IX_writtenExam)
虽然我们可以指定SQL Server按哪个索引进行数据查询,但一般不需要我们人工指定.SQL Server将会根据我们创建的索引,自动优化查询.
索引的优缺点
优点
– 加快访问速度
– 加强行的唯一性
缺点
– 带索引的表在数据库中需要更多的存储空间
– 操纵数据的命令需要更长的处理时间,因为它们需要对索引进行更新
创建索引的指导原则
请按照下列标准选择建立索引的列.
– 该列用于频繁搜索
– 该列用于对数据进行排序
请不要使用下面的列创建索引:
– 列中仅包含几个不同的值.
– 表中仅包含几行.为小型表创建索引可能不太划算,因为SQL Server在索引中搜索数据所花的时间比在表中逐行搜索所花的时间更长
以上就是土嘎嘎小编为大家整理的sqlserver做索引相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!