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

关于执行计划,sqlserver 和oracle的一点疑惑
本帖最后由 x_wy46 于 2013-07-12 14:12:17 编辑


create table table1
(
id int,
Name varchar(50),
Remark varchar(200),
CreateDate datetime
)
--在时间字段上创建聚集索引创建索引
create clustered index index_createdate on table1(createDate desc)
--在id字段上创建非聚集索引
create unique index index_id on table1(Id desc) 

select * from table1 where id ='1234'


--SELECT * FROM [table1] WHERE [id]=@1
  |--Nested Loops(Inner Join, OUTER REFERENCES:([dbtest1].[dbo].[table1].[CreateDate]))
       |--Index Seek(OBJECT:([dbtest1].[dbo].[table1].[index_1]), SEEK:([dbtest1].[dbo].[table1].[id]=(1234)) ORDERED FORWARD)
       |--Clustered Index Seek(OBJECT:([dbtest1].[dbo].[table1].[index_createdate]), SEEK:([dbtest1].[dbo].[table1].[CreateDate]=[dbtest1].[dbo].[table1].[CreateDate]) LOOKUP ORDERED FORWARD)


为什么会出现嵌套循环才能出结果?
按道理,根据非聚集索引查找到聚集索引,
根据聚集索引直接就找到数据的地址了,干嘛再循环嵌套一次呢?







--而oracle中就不一样了,类似的表,是一个索引组织表(相当于id上的聚集索引),根据普通索引来查询
--一样是普通索引找到聚集索引,然后直接出来结果了,看截图
create table indexTable(
       ID int,
       NAME varchar2 ( 50 ),
       CreateDate date,
       Remark varchar2(50),
       constraint pk_id primary key ( ID )
      )
     organization index;


     




.
索引 执行计划

------解决方案--------------------
这样写就不需要嵌套(Nested Loops)循环了..