【发布时间】:2008-12-01 14:10:07
【问题描述】:
我有一个 MS SQL 服务器应用程序,我在其中定义了我的关系和主键。
但是,我是否需要进一步定义关系字段的索引,这些索引有时不用于连接,而只是作为 where 子句的一部分?
我正在假设定义关系会创建一个索引,sql 引擎可以重用该索引。
【问题讨论】:
标签: sql sql-server tsql
我有一个 MS SQL 服务器应用程序,我在其中定义了我的关系和主键。
但是,我是否需要进一步定义关系字段的索引,这些索引有时不用于连接,而只是作为 where 子句的一部分?
我正在假设定义关系会创建一个索引,sql 引擎可以重用该索引。
【问题讨论】:
标签: sql sql-server tsql
关于这个主题已经写了一些很厚的书!
这里有一些经验法则:-
不要为任何
否则索引所有外键。
检查您的 SQL 并寻找最能减少您的结果集和索引该列的 where 子句。
例如。给定:
从颜色 =“红色”且制造商 =“宝马”和 ECAP =“2.0”的汽车中选择所有者;您可能有 20,000 辆红色汽车中的 5000 辆,因此编制索引不会有太大帮助。 但是,您可能只有 100 辆宝马,因此索引 MANUFACURER 会立即将您的结果集减少到 100,并且您可以通过简单地扫描一百行来消除蓝色和白色汽车。
通常,dbms 会根据基数选择一个或两个可用的索引,因此需要进行二次猜测并仅定义可能使用的那些索引。
【讨论】:
不会在外键约束上自动创建索引。但是唯一和主键约束将创建它们的约束。
为您使用的查询创建索引,无论是在连接上还是在 WHERE 子句上都是可行的方法。
【讨论】:
就像编程世界中的一切一样,这取决于。您显然希望创建索引和关系以保持规范化并加快数据库查找。但是您还希望通过没有太多索引来平衡这一点,因为 SQL Server 将花费更多时间来构建每个索引。此外,您拥有的索引越多,数据库中可能出现的碎片就越多。
所以我所做的就是放入明显的索引和关系中,然后在应用程序基于可能的慢查询构建后进行优化。
【讨论】:
定义关系不会创建索引。
通常在需要索引的某些字段有 where 子句的地方,但请注意不要只是将索引扔到所有地方,因为它们可以而且确实会影响插入/更新性能。
【讨论】:
我会首先确保每个 PK 和 FK 都有一个索引。
除此之外,我发现在 SSMS 中使用索引调整向导会在您向其提供正确信息时提供极好的建议。
【讨论】:
数据库注意事项
在设计索引时,请考虑以下数据库准则: 表上的大量索引会影响 INSERT、UPDATE、DELETE 和 MERGE 语句的性能,因为所有索引都必须随着表中数据的变化而适当调整。
避免过度索引大量更新的表并保持索引窄, 也就是说,尽可能少的列。
使用多个索引来提高对低数据表的查询性能 更新需求,但数据量大。大量的 索引可以帮助提高不修改数据的查询的性能, 比如 SELECT 语句,因为查询优化器有更多 可供选择的索引以确定最快的访问方法。
索引小表可能不是最佳的,因为它可以占用 查询优化器遍历索引搜索数据的时间比 执行简单的表扫描。因此,小表上的索引 可能永远不会使用,但仍必须作为数据保存在 表更改。
视图索引可以提供显着的性能提升,当 视图包含聚合、表连接或以下组合 聚合和连接。视图不必显式 在查询中引用以供查询优化器使用。
--Stay_Safe--
【讨论】:
索引并不昂贵,而且查询速度比您想象的要快。我建议为查询中经常使用的所有关键和非关键字段添加索引。您甚至可以使用执行计划来推荐可以加快查询速度的其他索引。
索引对您不利的唯一一点是当您进行大量数据插入时。每次插入都需要表中的每个索引与表的数据一起更新。
您可以选择等到应用程序正在运行并且您对数据库有一些已知的查询要改进,或者如果您有一个好主意,您现在可以这样做。
【讨论】: