不错呦!smile@林凯西,确保“准备文件”中的几个文件都有安装,S...您好,看了您这篇帖子觉得很有帮助。但是有个问题想请...我的修改过了怎么还被恶意注册呢 @jjjjiiii 用PJ快9年了,主要是A...PJ3啊,貌似很少有人用PJ了,现在不是WP就是z...@332347365,我当时接入时错误码没有-10...楼主,ChkValue值应为-103是什么意思呢?...大哥 你最近能看到我发的信息,请跟我联系,我有个制...
SQL Server外键需不需要建立索引?
编辑:dnawo 日期:2012-12-18
会有这个疑问,我认为主要有两点原因:
·主键"不需要"建立索引,所以外键需不需要建立索引?
·外键本身是另一个表的主键,主键一般有聚集索引,这个索引会不会应用到查询上?
针对第一点,实际情况是主键是有建立索引的,通常就是表的聚集索引,由于在创建主键时自动创建了索引,所以让人错觉主键没有建立索引,因此,不管是主键还是外键,只要有需要,都得创建索引;针对第二点,我们可以做个测试。
在SQL Server 2008创建表并添加测试数据:
在SQL Server Management Studio中可以看到主键和外键,同时还有一个聚集索引:

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

从图中可以看到,查询是使用本表的聚集索引扫描,也没有用另一个表的索引(用了就怪了:))。
·主键"不需要"建立索引,所以外键需不需要建立索引?
·外键本身是另一个表的主键,主键一般有聚集索引,这个索引会不会应用到查询上?
针对第一点,实际情况是主键是有建立索引的,通常就是表的聚集索引,由于在创建主键时自动创建了索引,所以让人错觉主键没有建立索引,因此,不管是主键还是外键,只要有需要,都得创建索引;针对第二点,我们可以做个测试。
在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
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 | 查看次数: 6044
发表评论
请登录后再发表评论!