问个问题,建表时,外键约束对性能有多大损耗 问个问题,建表时,外键约束对性能有多大损耗 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 70-461上面有一个note,外键上加上非聚集索引能够提高性能。至于约束,由于要检查是否满足定义,必然带来一定的开销,但是多少这个没有办法说准确 外键约束在更新或者删除数据的时候,要去扫描(或者查找,这里不扣字眼)一遍引用这个外键的表,这个就是所谓的影响吧其实想看这个代价很容易test,test2两个完全一样的表,数据也一样,test一个列为test2的一个外键,在两个表中,你删除同样一个ID的数据,效果不就出来了置于设置外键的表怎么处理,是扫描还是查找,那就看如何见索引了create table test( col1 varchar(50), col2 varchar(50), col3 varchar(50), col4 varchar(50), col5 varchar(50),)alter table testadd constraint pk_id primary key(col1) --创建表2select * into test2 from test select * from test2--对表2增加外键alter table test2add constraint fk_col1 foreign key(col1) references test(col1)alter table test2add constraint pk_id2 primary key(col1) select * from test2insert into test values (NEWID(),NEWID(),NEWID(),NEWID(),NEWID())go 100000insert into test2 select * from testset statistics io ondelete from test where col1='E6200F7E-B53A-49EF-B3B5-96E485C390AF'(1 行受影响)表 'test2'。扫描计数 0,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。表 'test'。扫描计数 0,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。delete from test2 where col1='E6200F7E-B53A-49EF-B3B5-96E485C390AF'(1 行受影响)表 'test2'。扫描计数 0,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 不建外键或者主键约束,只是在应用中取做逻辑判断,太危险了,我是吃过这个亏,因为写的代码总是有bug,只怪自己技术烂某些情况下判断不到,造成逻辑上重复的数据,处理起来太痛苦了,如果有主外键约束,宁愿报错也不愿意让它出现错误的数据 不建外键或者主键约束,只是在应用中取做逻辑判断,太危险了,我是吃过这个亏,因为写的代码总是有bug,只怪自己技术烂某些情况下判断不到,造成逻辑上重复的数据,处理起来太痛苦了,如果有主外键约束,宁愿报错也不愿意让它出现错误的数据程序未经充分测试就上线,根本不及格!还没达到讨论性能的层次。这种“经验就”不要分享出来了。 我这个确实不是“经验”,我写的那些系统也就是业余级的,只是自己的“经历”罢了,实在是摆不上台面用不用主外键,这个确实有很多争议,每个人都有自己的看法http://www.itpub.net/thread-1313696-3-1.html 不用显式外键确实能提高性能,但是要付出更多的代价去维护数据一致性,Oracle和(SQL Server/DB2/Sybase)不同,前者比较“创造性”地实现功能,后者通常比较严格执行关系数据库理论。我个人偏向学院派,毕竟关系型数据库系统的最主要目的是维护数据的一致性,而不是“高性能”,数据的混乱即使查询秒杀,也没有多大意义。并且性能可以从多方面去合理提高。关系数据库理论存在了接近40年,早以接近完善,重点是如何去用好而已 理论上,我还是喜欢规范一线,就像发粪哥讲的,关系型数据库的一致性,实际上,系统里面几乎没有外键约束,就像唐诗哥讲的,会产生隐性锁,高并发时性能不佳.缘由是 昨天同事删了一张正式业务主表,把所有数据都删掉了,由于主表没有外键约束,所以删的是相当轻松,700w条数据,弄的DBA都叫起来了。 真实环境下,还能让非DBA直接更改数据?这样的管理 删除7天的批处理 在SQL中如何得到时间? 这样的存储过程问题怎么处理? 列名 '男' 无效 请教一函数! ACCESS的库能导成SQL Server吗 一个关于行列转换的问题 自引用表如何级联删除??? IP地址 问题 继续求助!谢谢大家,再给些帮助吧! 在线等待,小问题 求一sql语句 新手求一条查询重复数据的SQL语句
其实想看这个代价很容易test,test2两个完全一样的表,数据也一样,test一个列为test2的一个外键,在两个表中,
你删除同样一个ID的数据,效果不就出来了
置于设置外键的表怎么处理,是扫描还是查找,那就看如何见索引了create table test
(
col1 varchar(50),
col2 varchar(50),
col3 varchar(50),
col4 varchar(50),
col5 varchar(50),
)alter table test
add constraint pk_id primary key(col1) --创建表2
select * into test2 from test select * from test2
--对表2增加外键
alter table test2
add constraint fk_col1 foreign key(col1) references test(col1)
alter table test2
add constraint pk_id2 primary key(col1) select * from test2insert into test values (NEWID(),NEWID(),NEWID(),NEWID(),NEWID())
go 100000insert into test2 select * from test
set statistics io on
delete from test where col1='E6200F7E-B53A-49EF-B3B5-96E485C390AF'
(1 行受影响)
表 'test2'。扫描计数 0,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'test'。扫描计数 0,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
delete from test2 where col1='E6200F7E-B53A-49EF-B3B5-96E485C390AF'
(1 行受影响)
表 'test2'。扫描计数 0,逻辑读取 3 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
不建外键或者主键约束,只是在应用中取做逻辑判断,太危险了,我是吃过这个亏,
因为写的代码总是有bug,
只怪自己技术烂
某些情况下判断不到,造成逻辑上重复的数据,处理起来太痛苦了,
如果有主外键约束,宁愿报错也不愿意让它出现错误的数据
不建外键或者主键约束,只是在应用中取做逻辑判断,太危险了,我是吃过这个亏,
因为写的代码总是有bug,
只怪自己技术烂
某些情况下判断不到,造成逻辑上重复的数据,处理起来太痛苦了,
如果有主外键约束,宁愿报错也不愿意让它出现错误的数据
程序未经充分测试就上线,根本不及格!还没达到讨论性能的层次。
这种“经验就”不要分享出来了。
实际上,系统里面几乎没有外键约束,就像唐诗哥讲的,会产生隐性锁,高并发时性能不佳.缘由是 昨天同事删了一张正式业务主表,把所有数据都删掉了,由于主表没有外键约束,所以删的是相当轻松,
700w条数据,弄的DBA都叫起来了。
这样的管理