假设我有两个表,产品和产品类别.两个表在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无助于提高查询性能?

所以我必须创建产品索引.分类.当我再次创建执行计划时,两个表都执行索引查找.估计子树成本大大降低.

我的问题是:

  1. 除了FK有助于关系约束之外,它还有其他用处吗?它是否提高了查询性能?

  2. 我应该在所有表中的所有FK列(liked Products.CategoryId)上创建索引吗?

推荐答案

外键是一种引用完整性工具,而不是性能工具.至少在SQL Server中,创建FK不会创建关联的索引,您应该在所有FK字段上创建索引,以缩短查找时间.

Sql相关问答推荐

SQL基于多个值 Select 单行

当一个视图在Postgres中失效时?

返回UPSERT中的旧行值

IF NOT EXISTS子查询的性能瓶颈

将FLOAT转换为VARBINARY,然后再转换回FLOAT

合并分层表SQL中的第一个非空、变化的空位置

将JSON文件导入Postgres 16数据库时出错(22P04上次预期列之后的额外数据)

MS Access问题查询中的自定义字段

最小非重复集的SQL查询

Postgres jsonpath运算符的变量替换,如_regex?

如何在Hive SQL中分别按多列进行分组?

如何在 SQL Server 中解决这个复杂的窗口查询?

匹配 H[0-9][0-9] 但不匹配除字母 H 之外的任何字母

Postgres,使用 select 插入多个值

将一名成员金额分配给群组内的其他成员

SQL:考虑合并分支计算分支的增长百分比

自动生成计算频率的列

String_Split 多列

如何在 SQLite 中将列的两个或多个相等的连续值合并为一个?

具有 GROUP BY 和 HAVING 的 BIGQUERY SQL 代码以过滤掉观察结果