标签:
-- 先模拟环境,后面说明: USE [Temp] GO -- DROP TABLE [TestTab] TRUNCATE TABLE [TestTab] CREATE TABLE [dbo].[TestTab]( [UserAcount] [varchar](50) NOT NULL, [UserName] [varchar](50) NOT NULL, [crdatetime] [datetime] NOT NULL, [value] [numeric](18, 4) NULL, [Info] [varchar](50) NULL, CONSTRAINT [PK_TestTab] PRIMARY KEY CLUSTERED ([UserAcount] ASC,[UserName] ASC) ) ON [PRIMARY] GO -- DROP VIEW [VTestTab] CREATE VIEW [dbo].[VTestTab] AS SELECT [UserAcount],[UserName],[crdatetime],[value],[Info] FROM [dbo].[TestTab] WHERE [UserAcount] = CURRENT_USER GO -- 插入测试数据: 2538 行 INSERT INTO [TestTab]([UserAcount],[UserName],[crdatetime],[value],[Info]) SELECT CURRENT_USER,name,MAX(crdate),FLOOR(RAND(ABS(CHECKSUM(NEWID())))*1000),NULL FROM master.sys.sysobjects WHERE LEN(name)>1 AND LEN(name)<50 GROUP BY name
现有以下这个查询:
SELECT * FROM [VTestTab] WHERE [crdatetime] = '2011-06-17 03:18:08.647'
看执行计划,查询是走索引的.因为视图将转变为对表的查询,如下:
SELECT * FROM [TestTab] WHERE [UserAcount] = CURRENT_USER AND [crdatetime] = '2011-06-17 03:18:08.647'
所以,现在测试看看到底聚集索引到底查询了多少行!
--使用序列化查看,在事务结束前查看锁情况。 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRAN SELECT * FROM [VTestTab] WHERE [crdatetime] = '2011-06-17 03:18:08.647' select resource_type,resource_description,request_mode,request_status,request_type,request_lifetime from sys.dm_tran_locks where resource_database_id=DB_ID() and request_session_id=@@SPID COMMIT TRAN
可以看到,整个哈希键都查找了一遍.有页锁(PAGE:IS),键范围锁(KEY:RangeS-S)。把符合索引键[UserAcount]的用户到查询出来了!但最终只返回一行。
如果表中的数据达到了锁升级要求(表行数五六千以上),对表将升级为共享锁!
既然不是最好的,那就考虑另外的索引定位了!
当前聚集索引键列为:([UserAcount],[UserName])
现考虑4种索引创建方法,到底哪种比较较好!~
-- DROP INDEX IX_TestTab ON [TestTab] CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([UserAcount],[crdatetime]) CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime]) CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime],[UserAcount]) CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime])INCLUDE([value],[Info])
--第一种: CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([UserAcount],[crdatetime])
--第二种: CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime])
--第三种: CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime],[UserAcount])
--第四种: CREATE NONCLUSTERED INDEX IX_TestTab ON [TestTab]([crdatetime])INCLUDE([value],[Info])
这个锁定的资源就比较直接了!~完全使用非聚集索引查找,查询直接定位到数据行!~
所以对于聚集索引,应尽量使用唯一列作为聚集索引,或者最为键列的数据尽量不要重复,这样才能以最快速度定位到行。若没有唯一列,像上面的例子中,聚集索引和另一个比较有效的列作为组合索引聚集索引!~
标签:
原文地址:http://blog.csdn.net/kk185800961/article/details/46010497