降低PK对其他指标的影响

发布于 2024-12-02 08:13:21 字数 255 浏览 0 评论 0原文

我需要更新大型 SQL Server 2005 数据库中的大量键,并且将在一堆表上删除 FK 和 PK,进行更新(替换 PK/FK 的值),然后添加 FK 和 PK再次。

我的问题是:

  1. 此过程是否会对这些表上现有的索引产生任何影响 包含 PK/FK 字段的索引或其他不受影响字段的索引。即所有索引仍然存在,它们需要重建

  2. 此过程是否会影响表统计信息,需要重新计算?

非常感谢

I need to update a large number of keys in a large SQL Server 2005 database and will be dropping FKs and PKs on a bunch of tables, doing the update (which replaces the values of the PK/FK) and then adding the FK and PK again.

My questions are:

  1. Will this process have any effect on exsiting indexes that exist on those tables, either
    indexes that include the PK/FK fields or indexes on other unaffected fields. ie will all indexes still exists, will they need a rebuild?

  2. Will this process affect table statistics, requiring a recalc?

Many thanks

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

醉城メ夜风 2024-12-09 08:13:21

如果您删除 PK(通常是聚集索引),SQL Server 将删除并重新创建所有非聚集索引(这是必需的,因为如果您有聚集索引,非聚集索引将指向聚集索引)。如果您没有聚集索引(堆),则非聚集索引指向数据行

重建聚集索引将自动更新统计信息,重组不会

如果您使用级联更新 然后它们应该自动更新

例如

create table pri(id int not null primary key)
go

create table ForeignK(fid int not null)
go


ALTER TABLE dbo.ForeignK ADD CONSTRAINT
    FK_ForeignK_pri FOREIGN KEY
    (fid) REFERENCES dbo.pri(id) ON UPDATE  CASCADE 
     ON DELETE  NO ACTION 

     insert pri values(1)
     insert ForeignK values(1)

现在更新 PK 表,

 update pri set id = 5
 go

现在也将是 5

 select * from ForeignK

If you drop a PK (which is usually a clustered index) SQL Server will drop and recreate all non clustered indexes(this is needed because if you have a clustered index the non clustered indexes point to the clustered index). If you don't have a clustered index (a heap) the non clustered indexes point to the data row

rebuilding a clustered index will automatically update statistics, a reorg won't

If you created the keys with cascade update then they should be updated automatically

example

create table pri(id int not null primary key)
go

create table ForeignK(fid int not null)
go


ALTER TABLE dbo.ForeignK ADD CONSTRAINT
    FK_ForeignK_pri FOREIGN KEY
    (fid) REFERENCES dbo.pri(id) ON UPDATE  CASCADE 
     ON DELETE  NO ACTION 

     insert pri values(1)
     insert ForeignK values(1)

now update the PK table

 update pri set id = 5
 go

this will now be 5 also

 select * from ForeignK
半窗疏影 2024-12-09 08:13:21

索引列的每次更改都会导致结构更改的传播。

对于外键,您可以禁用它们然后重建。对于私钥,您唯一能做的就是重建它们。我认为 SQLMenace 清楚地解释了原因。

更多

Every change in indexed column has a propagation in structure change.

For foreign key you could disable them and then rebuild. For private key only thing you can do is to rebuild them. I think that SQLMenace explained it clearly why.

More

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文