假设我有两个表,产品和产品类别.两个表在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 server 中序列化使用 OpenJson() 反序列化的对象

MariaDB case 陈述

如何删除具有重复列组合的行

SQL - 按订单条件分组

如何从另一个表中获取最后 2 条记录作为列

如何计算给定状态的最后记录?

如何在snowflake中使sql在show命令中计算字符@

BigQuery JSON - 标量子查询产生了多个元素

获取 SQL Server 2018 中的第 3 大时间值

可以在 Oracle View 中进行复杂的汇总或求和吗?

ROW_NUMBER 无 ORDER BY

创建或替换触发器 postgres

从表中选择多个列,但按一个分组

计算PostgreSQL中字符串中子字符串的出现次数

Google Electron 表格“=QUERY”join() 等效函数?

除法( / )没有在 postgresql 中给出我的答案

您可以从 influxdb 中删除数据吗?

postgresql - 查看架构权限

空数组作为 PostgreSQL 数组列默认值