提问人:NDallasDan 提问时间:10/25/2023 最后编辑:marc_sNDallasDan 更新时间:10/26/2023 访问量:50
Microsoft SQL Server:现有表新PK和索引问题
Microsoft SQL Server : existing table new PK & index issue
问:
我有一个旧的数据库,不幸的是,在设计时选择了最大的表之一,其中包含照片(称为表)并具有 PK 类型。此表有 195k 行,显然几乎是 100% 的碎片。我想在这个桌子上建立一个新的PK,但有一些问题和考虑Photos
uniqueidentifier
数据背景
表的行大小预计不会超出 (int) 的边界。此外,与表的 PK 没有 FK 关系。如前所述,表中有 195k 行。有一个潜在的考虑因素:called 中有一个非唯一列,它与另一个称为 的表的 PK 具有 FK 关系。该键的性质是这样的,它是一个递增计数器 (int)。表中的PK和表中的FK之间存在一>多关系。Photos
Photos
Photos
Job_ID
DeliveryTicket
Job_ID
DeliveryTicket
Job_ID
Photos
我的担忧源于碎片化和索引的角度,我的问题是:
如何将PK约束添加为非null的新列,并使用类型(int)的新递增索引填充现有行?
New_ID
Photos
我是否应该以及如何在表上的 FK 值上创建新的聚集索引?请注意,通过程序逻辑,对表的大多数查询将针对 FK 值,但绝不会针对表的现有或任何新 PK。该表的最快索引将位于 FK 关系列上。
Photos
Photos
Job_ID
Photos
Photos
Job_ID
有没有更好的方法可以以某种方式创建一个新的 PK,该 PK 从 的最低(非唯一 on )值开始计数,以便默认索引 (PK) 成为最快的索引?
Photos
Job_ID
以下是以下声明:CREATE TABLE
Photos
CREATE TABLE [dbo].[Photos]
(
[ID] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[Photo_Serial_Number] [int] IDENTITY(1,1) NOT NULL,
[Job_ID] [int] NOT NULL,
[Photo_Upload_Disposition_Type] [int] NOT NULL,
[NET_Rating] [real] NULL,
[Rating_ID] [int] NULL,
[Image_Data] [varbinary](max) FILESTREAM NOT NULL,
[File_Name] [nvarchar](50) NOT NULL,
[File_Extension] [varchar](5) NOT NULL,
[Image_Comments] [nvarchar](1000) NULL,
CONSTRAINT [PK_Photos] PRIMARY KEY CLUSTERED (ID)
);
我正处于探索阶段。这是一个生产数据库,虽然它将被备份并测试更改,因为它必须在维护时段内发生,但尚未进行此类更改。
答:
此表有 195k 行,显然几乎是 100% 的碎片。
那又怎样?您是否有可衡量的性能问题?只需添加默认值 NEWSEQUENTIALID 即可生成顺序 GUID,以减少今后的碎片。
评论
New_Id
Photo_Serial_Number
IDENTITY
Job_ID
Photo_Serial_Number
Job_ID