我有一个MS SQL服务器应用程序,我已经定义了我的关系和主键。
但是,我是否需要进一步定义关系字段的索引,这些索引有时不会在连接中使用,而只是作为where子句的一部分?
我正在假设定义一个关系会创建一个索引,sql引擎可以重用它。
答案 0 :(得分:6)
关于这个主题已经写了一些非常厚的书!
以下是一些拇指: -
不要打扰(除了PK)任何表格与< 1000行。
否则索引所有FK。
检查您的SQL并查找最能减少结果集的where子句并将其作为columun的索引。
例如。给出:
SELECT OWNER FROM CARS WHERE COLOUR = 'RED' AND MANUFACTURER = "BMW" AND ECAP = "2.0";
你可能拥有超过20,000辆的5000辆红色汽车,所以索引这个并不会有多大帮助。 然而,你可能只有100辆宝马,所以索引MANUFACURER会立即将你的结果设置减少到100,你只需扫描一百行即可消除蓝白车。
通常,dbms将根据基数选择一个或两个可用的索引,因此可以支付第二次猜测并仅定义那些可能使用的索引。
答案 1 :(得分:4)
不会在外键约束上自动创建索引。但是,独特的主键约束将创建它们。
为您使用的查询创建索引,无论是在连接上还是在WHERE子句上,都可以创建索引。
答案 2 :(得分:2)
与编程世界中的所有内容一样,它取决于。您显然希望创建索引和关系以保持规范化并加速数据库查找。但是你也希望通过没有太多的索引来平衡它,这将使SQL Server有更多的时间来构建每个索引。此外,您拥有的索引越多,数据库中可能出现的碎片就越多。
所以我做的是放入明显的索引和关系,然后在应用程序构建可能的慢查询后进行优化。
答案 3 :(得分:1)
定义关系不会创建索引。
通常在你对一些字段有一个where子句的地方你想要一个索引,但要注意不要只是将索引抛出到处,因为它们可以并且确实对插入/更新性能产生影响。
答案 4 :(得分:0)
我首先要确保每个PK和FK都有一个索引。
除此之外,我发现在SSMS中使用索引优化向导可以为您提供正确的信息。
答案 5 :(得分:0)
数据库注意事项
设计索引时,请考虑以下数据库准则: 表上的大量索引会影响INSERT,UPDATE,DELETE和MERGE语句的性能,因为必须根据表中的数据更改来适当调整所有索引。
避免对大量更新的表进行过度索引并保持索引缩小, 也就是说,尽可能少列。
使用许多索引来提高低表的查询性能 更新要求,但需要大量数据。大量的 索引可以帮助执行不修改数据的查询, 比如SELECT语句,因为查询优化器有更多 索引可供选择以确定最快的访问方法。
索引小表可能不是最佳的,因为它可以采用 查询优化器更长,以遍历索引搜索数据 执行简单的表扫描。因此,小表上的索引 可能永远不会被使用,但仍必须作为数据维护 表格更改。
视图索引可以提供显着的性能提升 视图包含聚合,表联接或组合 聚合和连接。视图不必是明确的 在查询中引用查询优化器来使用它。
- Stay_Safe -
答案 6 :(得分:-1)
索引并不是非常昂贵,并且比您意识到的更快地加快查询速度。我建议将索引添加到查询中经常使用的所有键和非键字段。您甚至可以使用执行计划来推荐可以加快查询速度的其他索引。
索引对您不利的唯一一点是,当您进行大量数据插入时。每个插入都要求表中的每个索引与表的数据一起更新。
您可以选择等待应用程序运行,并且您有一些针对要改进的数据库的已知查询,或者如果您有好主意,可以立即执行此操作。