小编aar*_*lin的帖子

复合主键作为外键的效率

我有一个带有复合主键(由 4 列组成)的表,用于确保没有重复项输入到表中。我现在需要一个新表,它需要将此表中的键作为外键引用。

我的问题是哪种方法对查找速度更有效:

1)我是否创建包含所有 4 列的新表并在外键中引用它们。

或者

2)我是否在主键表中创建一个新的标识列并将其用作新表中的外键。

预计该数据库将保存大量数据,因此我一直构建它,以期最大限度地减少每个表中保存的数据量。考虑到这一点,选项 2 将是最好的方法,因为我将为每一行保存 2 个 int 列和一个 datetime 列,但我想避免在不必要的情况下增加查找时间。

sql-server-2008 database-design primary-key identity composite-types

12
推荐指数
2
解决办法
6436
查看次数

重建大型聚集主键索引的磁盘空间注意事项

我们的数据库中有一个超过 2 亿行的表和一个超过 100GB 的聚集主键索引。主键之所以这么大,是因为已经从表中归档了数百万行,并且此后没有重建索引。通过重建,我希望大大减少索引的大小并释放我们数据库中的大量空间。

我们遇到的问题是磁盘只有 20GB 的可用空间,我担心重建索引时临时需要多少空间。

做这个的最好方式是什么?我是硬着头皮重建索引并希望有足够的空间吗?还是我放弃 PK 并从头开始重建它?

归档详细信息
归档工作是在日期时间列上完成的,并且归档超过一年的所有内容。这应该与主键并行运行,主键是一个自动增量,因为日期时间列在创建行时也会自动填充。

数据库、表和索引详细信息
行数:~212,300,000
数据空间:~109,000 MB
索引空间:~517 MB
恢复模式:完整

数据文件可用空间:5,991 MB / 151,000 MB
数据文件驱动器空间:18.7 GB

日志文件可用空间:2275 MB / 25000 MB
日志文件驱动器空间:79 GB

tempdb 可用空间:7476 MB / 19232 MB

表上只有一个索引,即聚簇主键:

关键列:1x bigint
排序:升序

我们使用的是 SQL Server 2008 R2 标准版。

sql-server clustered-index maintenance sql-server-2008-r2

5
推荐指数
1
解决办法
4413
查看次数

删除行会增加索引大小

我们在 SQL Server 2008 R2 标准服务器中有一个非常大的表,我通过将它们复制到单独磁盘上的另一个数据库中来存档行,然后使用 SSIS 数据流从原始表中删除它们。该表有一个 bigint 主键,并且正在按照该键的数字顺序删除行。然而,当我删除行时,表的整体索引大小正在稳步增加,我不知道为什么。在整个过程中,数据大小保持不变。


以下是表的详细信息:

行数:~300,000,000
数据大小:~65 GB
索引大小:~65 GB

行正在以每小时约 350,000 的速度被删除。

列定义使用以下数据类型:smallint、int、bigint、char、varchar、nvarchar、uniqueidentifier、bit、datetime

该表有一个主键,即表上的聚集键以及 4 个非聚集索引。

该表也是复制维护计划的一部分。表的复制副本的数据大小和索引大小都在减少!


上周我在另一个表上执行了相同的过程,当我删除行时,我可以看到该表的数据大小和索引大小都在减少。

在这种情况下,是否有任何解释为什么索引大小会不断上升?

index delete ssis sql-server-2008-r2 archive

4
推荐指数
1
解决办法
1090
查看次数