假设我有2个表,Products和ProductCategories.两个表都与CategoryId有关系.这是查询.
SELECT p.ProductId, p.Name, c.CategoryId, c.Name AS Category FROM Products p INNER JOIN ProductCategories c ON p.CategoryId = c.CategoryId WHERE c.CategoryId = 1;
当我创建执行计划时,表ProductCategories执行集群索引查找,这是期望的.但对于表产品,它执行集群索引扫描,这让我怀疑.为什么FK无助于提高查询性能?
所以我必须在Products.CategoryId上创建索引.当我再次创建执行计划时,两个表都执行索引查找.估计的子树成本降低了很多.
我的问题是:
除了FK有助于关系约束,它还有其他用处吗?它是否提高了查询性能?
我应该在所有表中的所有FK列(如Products.CategoryId)上创建索引吗?
cmsjr.. 181
外键是参照完整性工具,而不是性能工具.至少在SQL Server中,创建FK不会创建关联索引,您应该在所有FK字段上创建索引以改善查找时间.
外键是参照完整性工具,而不是性能工具.至少在SQL Server中,创建FK不会创建关联索引,您应该在所有FK字段上创建索引以改善查找时间.
外键可以改善(和伤害)性能
如上所述:外键可提升性能
您应该始终在FK列上创建索引以减少查找.SQL Server不会自动执行此操作.
编辑
由于链接现在似乎已经死了(克里斯注意到了),下面显示了为什么外键可以改善(和伤害)性能的要点.
外键可以提高性能
外键约束在读取数据时提高了性能,但同时在插入/修改/删除数据时降低了性能.
在读取查询的情况下,优化器可以使用外键约束来创建更有效的查询计划,因为外键约束是预先声明的规则.这通常涉及跳过查询计划的某些部分,因为例如优化器可以看到由于外键约束,因此不必执行计划的特定部分.
外键是用于确保数据库完整性的DBMS概念.
任何性能影响/改进都将特定于所使用的数据库技术,并且是外键的目的的次要因素.
SQL Server中的一个好习惯是确保所有外键至少具有非聚簇索引.
我希望这能为您解决问题,但请随时索取更多详细信息.