Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server表-(或任何可能的SQL表)没有主键影响性能?_Sql_Sql Server - Fatal编程技术网

SQL Server表-(或任何可能的SQL表)没有主键影响性能?

SQL Server表-(或任何可能的SQL表)没有主键影响性能?,sql,sql-server,Sql,Sql Server,我有一个表,其中我没有明确定义主键,它不是真正需要的功能。。。然而,一位同事建议我添加一列作为唯一的主键,以随着数据库的增长提高性能 有人能解释一下这是如何提高性能的吗 没有使用索引(我知道我可以添加索引来提高性能,但不清楚主键如何提高性能。) 具体内容 主表是用户活动的日志,每个条目都有一个自动递增的列,因此它已经是唯一的,但没有设置为主键 此日志表引用详细说明特定活动的活动表,该活动表由主表中的自动递增项引用。因此,该值仅在主日志表中是唯一的,活动表中可能有100个条目引用该值作为标识符(例

我有一个表,其中我没有明确定义主键,它不是真正需要的功能。。。然而,一位同事建议我添加一列作为唯一的主键,以随着数据库的增长提高性能

有人能解释一下这是如何提高性能的吗

没有使用索引(我知道我可以添加索引来提高性能,但不清楚主键如何提高性能。)

具体内容

主表是用户活动的日志,每个条目都有一个自动递增的列,因此它已经是唯一的,但没有设置为主键

此日志表引用详细说明特定活动的活动表,该活动表由主表中的自动递增项引用。因此,该值仅在主日志表中是唯一的,活动表中可能有100个条目引用该值作为标识符(例如,对于会话212,Niall做了这500件事)


正如您可能猜到的,大部分数据都在活动表中。

主键会自动在主列上设置索引。为表设置索引将提高查询的性能

您不需要设置主键来提高性能,但应该为表设置索引以提高查询速度


这取决于您的查询和表格,哪些索引有意义,哪些没有意义。

添加到上述内容-通常,如果您经常搜索某个字段,它是索引的一个很好的候选对象。此外,例如,搜索整数ID通常比搜索字符串快

索引占用了更多的存储空间,但可以提高该字段的搜索性能。

正如Kimberly Tripp(索引女王)在她出色的博客文章中清楚地表明的那样,在SQL Server表上拥有一个聚集索引对所有操作都是有益的-是的,甚至对于插入操作也是如此

引用金伯利的话:

与堆相比,在集群表中(但仅在“右”集群表中)插入速度更快。这里的主要问题是 在IAM/PFS中查找以确定堆中的插入位置 比群集表中的速度慢(插入位置已知, 由聚集键定义)。当插入到图形中时,插入速度更快 定义订单的表格(CL)和订单的位置 不断增加


由于您的主键在默认情况下会自动在您定义的列上创建聚集索引,我认为是的,有一个主键(聚集)SQL Server表上的键(即使是日志表)确实会对性能产生积极影响。

主键可以帮助提高性能-它告诉SQL Server关于该字段的一些重要信息-它是唯一的且不为空。这有助于创建更高效的执行计划

上的MSDN参考资料值得一读

引述:

将主键和外键定义为中的约束时 数据库模式,服务器可以使用该信息创建最佳 执行计划


你的桌子看起来像什么?用例是什么?修复了你的链接。。。这很重要,但我要强调一点,即所描述的好处来自于拥有聚集索引,而不是聚集索引是主键这一事实。主键在默认情况下是聚集的这一事实是一个实现细节,也是SSM的一个实现细节。另一个好的读物是
Brad的Sure Guide to Indexes
。主要的收获是您应该在表上有一个聚集索引(PK或非PK)。根据预期的行数,我只会创建一个smallint、int或bigint标识列。这可能需要一个单独的问题,但如果作为聚集索引的列实际上没有用于任何查询,它是否仍在提高性能?@NiallByrne:是的!即使是集群表与堆这一事实已经有所帮助——在某些情况下,这是非常有用的。