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

数据库索引的一些问题
有个表 A表,里面有 Aid,Cid,ctext,etext,timefig,其中cid是外键,可能经常做查询,所以我把这个做索引,但是有个存储过程 可能需要cid和 timefig一起查询, 那我是建一个索引(cid)和一个联合索引(cid,timefig)还是都分开建?

联合索引里面可以添加很多个字段,如果我只查询一个字段没资格联合索引还会起作用吗?
还是根据每种查询(单个,多个)都建立索引?比如 每个要查询的字段都分别建立索引,在把一起查询的建立联合索引?
------解决方案--------------------
2005以上,可以使用这个脚本,来看看你的库上有没有无效的索引,但是有几点限制:
1、DMV是重启后重新计算,所以最好库运行了一段时间比如一周甚至一个月后再检查会有效果一点,
2、还是时间问题,有些功能可能一周都用不了,比如月结功能,是一个月用一次,这时候还是要比较长的时间才能准确。
3、这些是SQLServer内部的统计,具体是否合理,还是要人工分析,目前没有任何一个工具可以说完全脱离人工的。

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
 SELECT TOP 30
         DB_NAME() AS DatabaseName ,
         '[' + SCHEMA_NAME(o.Schema_ID) + ']' + '.' + '['
         + OBJECT_NAME(s.[object_id]) + ']' AS TableName ,
         i.name AS IndexName ,
         i.type AS IndexType ,
         s.user_updates ,
         s.system_seeks + s.system_scans + s.system_lookups AS [System_usage]
 FROM    sys.dm_db_index_usage_stats s
         INNER JOIN sys.indexes i ON s.[object_id] = i.[object_id]
                                     AND s.index_id = i.index_id
         INNER JOIN sys.objects o ON i.object_id = O.object_id
 WHERE   s.database_id = DB_ID()
         AND OBJECTPROPERTY(s.[object_id], 'IsMsShipped') = 0
         AND s.user_seeks = 0
         AND s.user_scans = 0
         AND s.user_lookups = 0
         AND i.name IS NOT NULL
 ORDER BY s.user_updates DESC
 

索引是否有效,很大程度要看你怎么用。这里怎么用主要是列的顺序,虽然听说05以后where的列顺序已经无关紧要,但是作为一个良好的习惯,还是要严格按照索引顺序来使用联合索引。