SQL关系和索引

时间:2008-12-01 14:10:07

标签: sql sql-server tsql

我有一个MS SQL服务器应用程序,我已经定义了我的关系和主键。

但是,我是否需要进一步定义关系字段的索引,这些索引有时不会在连接中使用,而只是作为where子句的一部分?

我正在假设定义一个关系会创建一个索引,sql引擎可以重用它。

7 个答案:

答案 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语句的性能,因为必须根据表中的数据更改来适当调整所有索引。

  1. 避免对大量更新的表进行过度索引并保持索引缩小, 也就是说,尽可能少列。

  2. 使用许多索引来提高低表的查询性能     更新要求,但需要大量数据。大量的     索引可以帮助执行不修改数据的查询,     比如SELECT语句,因为查询优化器有更多     索引可供选择以确定最快的访问方法。

  3. 索引小表可能不是最佳的,因为它可以采用     查询优化器更长,以遍历索引搜索数据     执行简单的表扫描。因此,小表上的索引     可能永远不会被使用,但仍必须作为数据维护     表格更改。

  4. 视图索引可以提供显着的性能提升     视图包含聚合,表联接或组合     聚合和连接。视图不必是明确的     在查询中引用查询优化器来使用它。

  5. - Stay_Safe -

答案 6 :(得分:-1)

索引并不是非常昂贵,并且比您意识到的更快地加快查询速度。我建议将索引添加到查询中经常使用的所有键和非键字段。您甚至可以使用执行计划来推荐可以加快查询速度的其他索引。

索引对您不利的唯一一点是,当您进行大量数据插入时。每个插入都要求表中的每个索引与表的数据一起更新。

您可以选择等待应用程序运行,并且您有一些针对要改进的数据库的已知查询,或者如果您有好主意,可以立即执行此操作。