首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

们谈谈索引

2013-06-25 
大虾们谈谈索引今天和人谈索引的时候碰到几个问题,情景是这样的:有表A,表结构为(ID,A,B),其中ID是主键,然

大虾们谈谈索引
今天和人谈索引的时候碰到几个问题,情景是这样的:
有表A,表结构为(ID,A,B),其中ID是主键,然后又在表A建了一个复合索引[ID asc,A asc,B asc]
问题是
1.一次查询中,一个表可以同时走两个索引吗?
2.我分别建[A asc]和[B asc]的索引,与[A asc,B asc]的复合索引等价吗?不等价的话有什么区别?

虽然不知道你们说些什么,但是感觉你们很牛B
[解决办法]
有索引,查询肯定是快了
如果不影响插入、修改的效率,多点索引也没错(数据库文件会大)
[解决办法]

引用:
索引怎么建,要看你的sql语句,也就是你的表的用法,单纯对着表来整索引并不有意义。


借宝地问一下,如果能够看到某个索引有没有被使用过???好像Oracle有这个功能吧??SQL Server有没有类似的功能??
[解决办法]
引用:
Quote: 引用:

索引怎么建,要看你的sql语句,也就是你的表的用法,单纯对着表来整索引并不有意义。


借宝地问一下,如果能够看到某个索引有没有被使用过???好像Oracle有这个功能吧??SQL Server有没有类似的功能??

判断无用索引:
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


[解决办法]
很入门的索引问题

1.一次查询中,一个表可以同时走两个索引吗?


这是一个有歧义的问题,同一个查询中,一个表的一次查询只能用一个索引,同一个表的多次查询可以用不同索引。比如下面的查询:
SELECT *
FROM TB T1
INNER JOIN TB T2 ON T1.COL1=T2.COL1 AND T1.COL2='A' AND T2.COL3='B'
假设这个表上有两个索引INX1 ON TB(COL2),INX2 ON TB(COL3),那么计划中就会分别查询两个索引再将结果集进行LOOP JOIN。

但如果是指一个表的同一次查询,就只可能调用一个索引,还是上面的查询,假设又有一个索引INX3 ON TB(COL2,COL4)
都可用于T1的查询,那系统会按自己的优先级选一个使用。

2.我分别建[A asc]和[B asc]的索引,与[A asc,B asc]的复合索引等价吗?不等价的话有什么区别?
这是个更常见的问题,这三个索引当然是不等价的
[A asc]和[B asc]的索引
这样的索引适用于
WHERE A IN/=/</>
WHERE B IN/=/</>
WHERE A IN/=/</> OR B IN/=/</>
类似于上面的查询

[A asc,B asc]的复合索引
适用于
WHERE A IN/=/</>
WHERE A IN/=/</> AND B IN/=/</>
这样的查询

热点排行