日期:2014-05-17  浏览次数:20759 次

[help] select语句没有用到组合索引。
表PagePermission: ID, AdminID, PageID, LastUpdateTime。
其中:ID是主键, (AdminID, PageID)是索引,并且非聚集、不唯一。
执行如下sql语句,没有用到(AdminID, PageID)索引。
select * from PagePermission where AdminID = 2 and PageID = 3;



如果将(AdminID, PageID)索引改成唯一的,那就用到了该索引。

谢谢。
sql 索引

------解决方案--------------------
--执行下面语句,看一下AdminID = 2在里面占了百分之多少。复合索引只记录第一个索引字段的统计,很可能是因为Admin=2的记录占的比较多,所以没走索引
select AdminID, COUNT(*)
from PagePermission 
GROUP BY AdminID
ORDER BY COUNT(*) DESC

--执行下面语句,应该会走索引Seek
SELECT ID, [Admin], PageID
FROM tb
WHERE AdminID = 2 AND PageID = 3

--如果改成唯一索引,很明显,具有高选择性,就会走索引

------解决方案--------------------
--就这个优化而言,楼主创建的索引中包含LastUpdateTime即可
CREATE INDEX IX_tb_AdminID_PageID ON dbo.tb
(
AdminID, 
PageID
)  INCLUDE(LastUpdateTime)
GO

------解决方案--------------------
#1.记录不多时,一般倾向于全表扫描。
#2.如果有唯一索引的话,倾向于唯一索引,因为唯一就说明绝对具有高选择性。
你说的对:
#1.根数据量大小有关系。
#2.SELECT中的字段也会对执行计划产生影响。
------解决方案--------------------
在小表上建索引的意义不大,执行计划会倾向于全表扫描.
因为读索引后再查聚集索引的成本,要高于直接全表扫描的执行成本.