sqlserver索引
❶ 如何查表是否有索引 sqlserver
1、本文以表pi_content为例,相应的字段为([piid] int, [seqnum] int,[phname] nvarchar(50),[content] nvarchar(MAX)),数据量为百万级。
❷ sqlserver 怎么建索引
(1)在SQL Server Management Studio中,选择并右击要创建索引的表,从弹出菜单中选择“设计”,打开表设计器。右键单击表设计器,从弹出菜单中选择“索引/键”命令,打开“索引/键”对话框。对话框中列出了已经存在的索引,如下图所示。
(2)单击“添加”按钮。在“选定的主/唯一键或索引”框显示系统分配给新索引的名称。
(3)在“列”属性下选择要创建索引的列。可以选择多达16列。为获得最佳性能,最好只选择一列或两列。对所选的每一列,可指出索引是按升序还是降序组织列值。
(4)如果要创建唯一索引,则在“是唯一的”属性中选择“是”。
(5)设置完成后,单击“确定”按钮。
(6)当保存表时,索引即创建在数据库中。
使用CREATE INDEX语句创建索引:
复制内容到剪贴板
代码:
CREATE[ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX索引名
ON {表名|视图名} (列名[ ASC | DESC ] [ ,...n ] )
例:
在数据库HrSystem中为表Employees创建基于IDCard列的唯一索引IX_Employees,可以使用以下命令:
复制内容到剪贴板
代码:
USE HrSystem
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_Employees]ONdbo.Employees(IdCard)
GO
例:
为表Employees创建基于列IDCard的唯一、聚集索引IX_Employees1,可以使用以下命令:
复制内容到剪贴板
代码:
USE HrSystem
GO
CREATE UNIQUE CLUSTERED INDEX [IX_Employees1] ON [dbo].[Employees](IdCard)
GO
需要注意的是,在一个表中只允许存在一个聚集索引。因此,如果表Employees中已经存在一个聚集索引,则执行上面的语句时将会提示下面的错误信息。
消息1902,级别16,状态3,第1行
无法对表'dbo.Employees'创建多个聚集索引。请在创建新聚集索引前删除现有的聚集索引'PK__Employee__263E2DD300551192'。 例:
对表Employees的列Emp_name按照降序创建索引,可以使用以下命令:
复制内容到剪贴板
代码:
USE HrSystem
GO
CREATENONCLUSTERED INDEX [IX_Employees2] ON [dbo].[Employees]
(
[Emp_name] DESC
)
GO
在CREATE INDEX语句中使用INCLUDE子句,可以在创建索引时定义包含的非键列,其语法结构如下:
复制内容到剪贴板
代码:
CREATENONCLUSTERED INDEX 索引名
ON { 表名| 视图名 } ( 列名 [ ASC | DESC ] [ ,...n ] )
INCLUDE (<列名1>, <列名2>, [,… n])
例: 在表Employees上创建非聚集索引IX_Wage,索引中的键列为Wage,非键列为Emp_name、Sex和Title,具体语句如下:
复制内容到剪贴板
代码:
USEHrSystem
GO
CREATENONCLUSTERED INDEX IX_Wage
ON Employees ( Wage )
INCLUDE (Emp_name, Sex, Title)
GO
例: 在创建索引IX_Wage后,当表Employees中的数据量比较大时,执行下面的SELECT语句将会明显地改进查询效率。
复制内容到剪贴板
代码:
USEHrSystem
GO
SELECTEmp_name, Sex, Title, Wage
FROMEmployees
WHEREWage BETWEEN 1000 AND 3000
GO
修改索引:
在SQL Server Management Studio中,选择并右击要创建索引的表,从弹出的菜单中选择“设计表”,打开表设计器。右键单击表设计器,从弹出菜单中选择“索引/键”命令,打开“索引/键”对话框,并查看已经存在的索引及修改索引的属性信息。
也可以使用ALTER INDEX语句修改索引,其基本语法如下:
复制内容到剪贴板
代码:
ALTER INDEX { 索引名| ALL }
ON <表名|视图名>
{ REBUILD | DISABLE | REORGANIZE }[ ; ]
ALTER INDEX语句的参数比较复杂,这里只介绍它的基本使用情况。参数说明如下:
REBUILD指定重新生成索引。 DISABLE指定将索引标记为已禁用。 REORGANIZE指定将重新组织的索引叶级。
例:
要禁用索引IX_Employees,可以使用下面的语句:
复制内容到剪贴板
代码:
USE HrSystem
GO
ALTERINDEX IX_Employees ON Employees DISABLE
GO
删除索引:
在SQL Server Management Studio中,选择并右击要创建索引的表,从弹出的菜单中选择“设计表”。打开表设计器。右键单击表设计器,从弹出菜单中选择“索引/键”命令,在打开的“索引/键”对话框中列出了已经存在的索引。单击“删除”按钮,即可删除索引信息。
复制内容到剪贴板
代码:
DROP INDEX 表名.索引名|视图名.索引名[ ,...n ]
总结:
o(1)索引并非越多越好,一个表中如果有大量的索引,不仅占用大量的磁盘空间,而且会影响INSERT、DELETE、UPDATE等语句的性能。因为当表中数据更改的同时,索引也会进行调整和更新。
o(2)避免对经常更新的表进行过多的索引,并且索引中的列尽可能少。而对经常用于查询的字段应该创建索引,但要避免添加不必要的字段。
o(3)数据量小的表最好不要使用索引,由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果。
o(4)在条件表达式中经常用到的、不同值较多的列上建立索引,在不同值少的列上不要建立索引。比如在学生表的“性别”字段上只有“男”与“女”两个不同值,因此就无须建立索引。如果建立索引,不但不会提高查询效率,反而会严重降低更新速度。
o(5)当唯一性是某种数据本身的特征时,指定唯一索引。使用唯一索引能够确保定义的列的数据完整性,提高查询速度。
o(6)在频繁进行排序或分组(即进行GROUPBY或ORDERBY操作)的列上建立索引,如果待排序的列有多个,可以在这些列上建立组合索引。
❸ sqlserver 索引
索引的基本结构
“索引(Index)提供查询的速度”这是对索引的最基本的解释,接下来我们将通过介绍索引的组成,让大家对索引有更深入的理解。 索引是数据库中的一个独特的结构,由于它保存数据库信息,那么我们就需要给它分配磁盘空间和维护索引表。创建索引并不会改变表中的数据,它只是创建了一个新的数据结构指向数据表;打个比方,平时我们使用字典查字时,首先我们要知道查询单词起始字母,然后翻到目录页,接着查找单词具体在哪一页,这时我们目录就是索引表,而目录项就是索引了。
当然,索引比字典目录更为复杂,因为数据库必须处理插入,删除和更新等操作,这些操作将导致索引发生变化。叶节点
假设我们磁盘上的数据是物理有序的,那么数据库在进行插入,删除和更新操作时,必然会导致数据发生变化,如果我们要保存数据的连续和有序,那么我们就需要移动数据的物理位置,这将增大磁盘的I/O,使得整个数据库运行非常缓慢;使用索引的主要目的是使数据逻辑有序,使数据独立于物理有序存储。
为了实现数据逻辑有序,索引使用双向链表的数据结构来保持数据逻辑顺序,如果要在两个节点中插入一个新的节点只需修改节点的前驱和后继,而且无需修改新节点的物理位置。双向链表(Doubly linked list)也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。
理论上说,从双向链表中删除一个元素操作的时间复杂度是O(1),如果希望删除一个具体有给定关键字的元素,那么最坏的情况下的时间复杂度为O(n)。
在删除的过程中,我们只需要将要删除的节点的前节点和后节点相连,然后将要删除的节点的前节点和后节点置为null即可。索引的类型
我们知道索引的类型有两种:聚集索引和非聚集索引。
聚集索引:物理存储按照索引排序。
非聚集索引:物理存储不按照索引排序。了解更多知识点击链接:http://www.jb51.net/article/30971.htm
❹ SQLSERVER对索引的利用及非SARG运算符认识
写SQL语句的时候很多时候会用到filter筛选掉一些记录,SQL对筛选条件简称:SARG(search
argument/SARG)
复制代码
代码如下:
where
amount>4000
and
amount<6000上面这句就是筛选条件
当然这里不是说SQLSERVER的where子句,是说SQLSERVER对索引的利用在SQLSERVER对于没有SARG运算符的表达式,索引是没有用的,SQLSERVER对它们很难使用比较优化的做法。
意思是说,如果你的SQL语句中没有where子句包括非SARG运算符,那么你的SQL语句是不会用到表格中的索引的
下面说一下哪些是非SARG运算符:
非SARG运算符包括
NOT、
<>、
NOT
EXISTS、
NOT
IN、
NOT
LIKE
规律就是有“NOT”
关键字
或者
不等于的意思
基本上利用不了索引
还有一些内部函数,如果使用这些内部函数SQLSERVER也不会用到索引
内部函数,例如:CONVERT(),UPPER()等
❺ sqlserver怎么为表添加索引怎么用
可以用create index创建索引,如create index test_idx on tablename(col1,col2)
系统优化时会自动选择使整个查询开销最小的查询计划。如你的sql 为select * from tablename where col1 = @col1 and col2 = @col2 时一般都会用到索引。
❻ SqlServer:索引是什么,以及为什么使用索引
收藏
问题反馈
索引
索引,使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。 在关系数据库中,索引是一种与表有关的数据库结构,它可以使对应于表的SQL语句执行得更快。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。当表中有大量记录时,若要对表进行查询,第一种搜索信息方式是全表搜索,是将所有记录一一取出,和查询条件进行一一对比,然后返回满足条件的记录,这样做会消耗大量数据库系统时间,并造成大量磁盘I/O操作;第二种就是在表中建立索引,然后在索引中找到符合查询条件的索引值,最后通过保存在索引中的ROWID(相当于页码)快速找到表中对应的记录。 索引是一个单独的、物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索索引以找到特定值,然后顺指针找到包含该值的行。 在数据库关系图中,可以在选定表的“索引/键”属性页中创建、编辑或删除每个索引类型。当保存索引所附加到的表,或保存该表所在的关系图时,索引将保存在数据库中。
❼ 如何查询sqlserver数据库中得所有索引
select a.name as tabname
,h.name as idname
from sys.objects as a
right join sys.indexes as h on a.object_id=h.object_id
where a.type<>'s'
go
由于索引和系统列没有直接对应关系 所以不能直接查看列字段和字段长度
❽ sqlserver怎么建立索引
--创建索引
CREATE NONCLUSTERED INDEX IX_TEST_TNAME --创建一个非聚集索引
ON TEST(TNAME) --为TEST表的TNAME字段创建索引
WITH FILLFACTOR = 30 --填充因子为30%
GO
SELECT * FROM TEST(INDEX = IX_TEST_TNAME) WHERE TNAME = 'A' --指定按‘IX_TE
❾ 为什么说SQLServer全文索引有局限性
下面假设有这样一个例子:在DataBase_name。dbo。Table_name中有一个名为Title(标题)和Contents(内容)的字段,现在需要查询在Title或者Contents中包括“qq”字符的所有记录。 面对这样的一个场景,我们通常都会写这样一个脚本:SELECT * FROM DataBase_name。
dbo。Table_name WHERE Title LIKE '%qq%' OR Contents LIKE '%qq%'; 没错,这也是我第一个想到的方法。但是我们需要思考的是:随着时间的推移,数据会越来越大,那个时候我们该如何提高我们的性能?用户随时都有可能再添加对Remark(备注)字段进行查找,难道我们就应该不厌其烦地修改程序代码? 需要指出的是:面对这样的查询条件,即使Title和Contents上都有索引,我们也无法使用到索引,因为在 '%qq%'的“qq”前面使用了通配符,所以无法使用到索引;如果查询的条件是'qq%',那到是可以利用上索引。
在许多数据库性能调优的文章上都说OR这个谓词可以使用SELECT UNION ALL SELECT这样的方式来提高性能,但是需要提醒大家的是:如果在一条记录中字段Title和Contents都同时存在“中国”字符的话,那么返回的结果就会出现两条相同的记录,如果你希望是唯一的记录,那么这个时候你就要注意了。
现在回到我们上面的问题,大概这个时候大家都应该想到了数据库的全文索引了。全文索引是一种特殊类型的基于标记的功能性索引,由 Microsoft SQL Server 全文引擎 (MSFTESQL) 服务创建和维护。创建全文索引的过程与创建其他类型的索引的过程差别很大。
MSFTESQL 不是基于某一特定行中存储的值来构造 B 树结构,而是基于要索引的文本中的各个标记来创建倒排、堆积且压缩的索引结构。(摘自MSDN) 为什么说SQL Server 全文索引不是万能的?可能大家都怀疑我是不是标题党了,呵呵,马上就讲到,那就是这个全文索引能解决我们一开始提到的场景吗?回答是否定。
为什么呢?因为它的分词和倒排索引造成了对字符串“tqq。tencent。com”这样的内容进行‘“*qq*”’这样的条件查询,上面那条记录是不会被返回的。它的分词应该是正向最大值的分词方法,它没有对方向再进行一次分词和索引,索引无法查询到。这个可能会被大家所忽略掉的。
❿ 认识SQLServer索引以及单列索引和多列索引的不同
SQLServer索引是为了加快查询的速度。
单列索引,就是以一个字段建立的索引,如 学号 ;
多列索引,就是以一个以上的字段建立的索引,如 学号,课程号。