SQL Server外键需不需要建立索引?

会有这个疑问,我认为主要有两点原因:

·主键"不需要"建立索引,所以外键需不需要建立索引?
·外键本身是另一个表的主键,主键一般有聚集索引,这个索引会不会应用到查询上?

针对第一点,实际情况是主键是有建立索引的,通常就是表的聚集索引,由于在创建主键时自动创建了索引,所以让人错觉主键没有建立索引,因此,不管是主键还是外键,只要有需要,都得创建索引;针对第二点,我们可以做个测试。

在SQL Server 2008创建表并添加测试数据:

--create
create table Person
(
    Id int identity(1,1) primary key,
    Name nvarchar(20)
)
create table Pet
(
    Id int identity(1,1) primary key,
    Pid int references Person(Id),
    Name nvarchar(20)
)
--data
declare @i int
set @i=1
while(@i<=10000) begin
    insert into Person(Name) select CAST(@i as nvarchar(20))
    insert into Pet(Pid,Name) select @i,CAST(@i as nvarchar(20))
    set @i=@i+1
end

在SQL Server Management Studio中可以看到主键和外键,同时还有一个聚集索引:



我们再使用外键列查询并查看执行计划:

select * from Pet where Pid=1



从图中可以看到,查询是使用本表的聚集索引扫描,也没有用另一个表的索引(用了就怪了:))。

评论: 0 | 引用: 0 | 查看次数: 5839
发表评论
登录后再发表评论!