关于sql中加入索引的问题

关于sql中加入索引的问题,第1张

直接在表上右键,选modify,进入表结构设计页面,在要设为主键的字段上右键,选"set primary key",保存退出,就OK了

或者,执行以下一条SQL语句也可以实现:

ALTER TABLE 表名 ADD CONSTRAINT

主键名 PRIMARY KEY CLUSTERED

(

字段名

) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

主键名随意填写,字段名填写要设为主键的字段名。

一、索引设计注意事项

(1)、检查WHERE条件和连接条件

当一条SQL语句提交时,查询优化器会根据表的信息查询最优的访问机制

1、优化器首先识别WHERE子句与连接条件中包含的列

2、优化器检索这些列上的索引

3、优化器通过从索引上的维护统计来确定子句的选择性以及评估索引的有效性

4、优化器根据前面几个步骤的信息,选择估计开销最低的方式

[sql] view plain copy

DBCC FREEPROCCACHE

SET STATISTICS IO ON

SET STATISTICS TIME ON

SELECT p.ProductID,p.Name,p.StandardCost,p.Weight,p.Color,p.ProductNumber

FROM Production.Product AS p

WHERE p.ProductID=871

表 'Product'。扫描计数 0,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

这里采用的数据库是微软提供的示例数据库AdventureWorks2008。

WHERE条件里面有ProductID,该字段上面有一个聚簇索引(主键),根据优化器的选择,最终选择该索引

[sql] view plain copy

DBCC FREEPROCCACHE

SET STATISTICS IO ON

SET STATISTICS TIME ON

SELECT pm.Name,p.ProductID,p.Name,p.StandardCost,p.Weight,p.Color,p.ProductNumber

FROM Production.Product AS p

INNER JOIN Production.ProductModel AS pm ON pm.ProductModelID=p.ProductModelID

WHERE p.ProductID=871

表 'ProductModel'。扫描计数 0,逻辑读取 2 次,物理读取 2 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

表 'Product'。扫描计数 0,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

ProductModelID是ProductModel的主键,也是Product的外键 ,ProductID是Product的主键,查看执行计划从上到下,从右到左。

首先根据ProductID=871查找Product表,这里使用聚簇索引没有问题。

第二部就是ProductModel表,这里根据连接条件来,发现也有可用的聚簇索引,所以上图使用了两个聚簇索引。

(2)、使用窄索引

在实际中,一般使用整形列来作为索引列,像VARCHAR、NVARCHAR等可能会很大,一般不用来作为索引列。

窄索引可以在8KB的索引页面容纳更多的行,这样有许多好处

A、减少IO数量(读取更少的8KB页面)

B、是数据库缓存更有效,SQL Server可以缓存更少的索引页面,从而减少内存中索引页面的逻辑读

C、减少数据库存储空间


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11607272.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-17
下一篇2023-05-17

发表评论

登录后才能评论

评论列表(0条)

    保存