1
5
是的,堆有问题。您的数据将逻辑上碎片化整个节目,不能简单地进行碎片整理。 想象一下,把你所有的电话簿扔进一个桶里,然后试图找到“鲍勃·史密斯”。或者使用传统的电话目录,在lastname、firstname上使用聚集索引。 维护索引的开销很小。 除非是唯一的,否则StartDate不是一个好的选择。聚集索引需要非聚集索引的内部唯一性。如果未声明唯一,SQL Server将添加一个4字节的“uniquifier”。 是的,我会用int或bigint来简化。关于guid:请参见屏幕右侧的问题。 编辑: 注意,pk和聚集索引是两个独立的问题,即使默认情况下SQL Server会使pk聚集。 |
2
3
堆碎片化不一定是世界末日。听起来你很少扫描数据,所以这不是世界末日。 非聚集索引会影响性能。每一个都需要将行的地址存储在underlynig表(堆或聚集索引)中。理想情况下,查询不必使用基础表本身,因为它以理想的方式存储所需的所有信息(包括所有列,因此它是一个覆盖索引)。 是的,金伯利·特里普的东西是指数的最佳选择。 罗布 |
3
2
正如您自己的研究所显示的,以及所有其他应答者所提到的,使用guid作为表上的聚集索引是一个坏主意。 然而,拥有一个堆也不是一个很好的选择,因为堆还有其他问题,主要是与碎片和其他不适合堆的事情有关。 我的最佳实践建议是:
我认为,通过添加int/bigint(即使只是为了拥有一个好的聚集索引)所获得的好处远远超过了它的缺点(正如KimTripp在她的博客文章中提到的那样)。 马克 |
4
1
由于guid是您的主键和外键,您的数据库仍然需要检查每个插入的约束,您可能需要对其进行索引。索引一个guid是不可取的,因为它是随机的。因此,我认为绝对应该沿着主密钥的bigint(可能是标识)路径走,并将其用作聚集索引。 |
Jack Skeletron · T-SQL三表求和 6 年前 |
CSK · 列出sql server中存储过程中的存储过程 6 年前 |
DRT · 从文本字段中提取多个日期 6 年前 |
ihatemash · 确定可以合并哪些行的SQL查询 6 年前 |
Shawn · 使用WinZip命令行的SQL Server作业 6 年前 |