Juan Manuel Palacios Asked: 2020-11-17 09:54:32 +0800 CST 2020-11-17 09:54:32 +0800 CST 2020-11-17 09:54:32 +0800 CST 在 SQL Server 中创建索引的最佳做法是什么? 772 我在使用 SQL Server 执行的查询的响应时间方面遇到问题。 研究我发现一个好的做法是创建与表或视图中的字段相关联的索引。 创建这些索引的最佳方法是什么?是为每个字段制作一个索引还是为几个字段制作一个索引方便? sql 3 Answers Voted Best Answer Marcos Crispino 2020-11-17T10:15:58+08:002020-11-17T10:15:58+08:00 您需要创建的索引数量在很大程度上取决于您的应用程序和您所做的查询。 添加索引将使查询(SELECT)执行得更快,但对数据库的更新(INSERT、UPDATE 或 DELETE)会更慢。 您绝对不应该为每个字段创建索引。您应该做的是了解索引是如何工作的,以了解您应该创建哪些索引。 最好的办法是让您确定花费时间最长的查询,并为每个查询决定您是否必须创建索引,以及要创建哪个索引。 关于要创建什么索引的一些规则应该非常通用(在确定查询之后): 如果查询遍历整个表并具有 ORDER,则 ORDER 中的字段可能位于索引中。 如果一个表有很多列,而你的查询只对少数几个列进行操作,将所有列放在索引中可以使 SELECT 不必去表,它直接去索引 在有很多记录的表中,如果查询有一个 WHERE 可以过滤其中的许多记录,那么在 WHERE 字段上创建索引可能是相当合理的。 在任何情况下,SQL Server 都有一个工具,即 SQL Server Profiler,它可以帮助您决定哪些索引可以在您的应用程序中使用。 Pablo Claus 2020-11-17T13:41:28+08:002020-11-17T13:41:28+08:00 @Marcos 说得很好,我想以一种非常简单的方式解释索引的主题。 默认情况下,SQL Server 使用主键在表上创建索引。 很多时候这是需要的,但并非总是如此。 想想纸质电话簿:它按城市、姓氏和名字排列。我们可以说它的索引就是那些字段。通过这种方式查找号码很容易,因为这就是您通常要查找的内容。如果我想要城市“A”的所有数字,很容易得到它们。 现在,如果我想要所有名为“Juan Manuel”的人的号码会怎样?现在索引对我没有用。我必须一个接一个地把它们全部弄出来。 数据库也会发生同样的事情。重要的是索引是搜索最多的内容。 还有一个细节,在 SQL Server 中你可以有两种类型的索引。 集群(只有一个,应该是访问表最多的字段) 逻辑(可以是多个) 我鼓励您对它们进行调查,看看什么最适合您的应用程序。 简而言之,我能说没有索引或创建不用于任何事情的索引是多么错误。正如@Marcos 向您解释的那样,这会使数据库因未使用的东西而过载。 我们在我公司通常做的是通过主键(用于连接)建立一个逻辑索引。索引通常由日期字段和主键聚集在一起。 DBAdixit 2020-02-23T09:34:46+08:002020-02-23T09:34:46+08:00 1.- 除了您被告知的内容之外,我建议您将数据库优化顾问 (DETA) 与给您带来问题的查询一起使用。DETA 会为您提供改进数据库结构以提高查询效率的建议(有时它建议创建索引、统计信息等)。 2.- 你可以做的另一件事是分析执行计划并检测一些有趣的东西,比如顺序扫描(表扫描)而不是索引搜索(索引搜索)。 3.- 如果你想要一些非常一般的建议,那么也许看到这些在 SQL Server 中使用索引的技巧会对你有用。
您需要创建的索引数量在很大程度上取决于您的应用程序和您所做的查询。
添加索引将使查询(SELECT)执行得更快,但对数据库的更新(INSERT、UPDATE 或 DELETE)会更慢。
您绝对不应该为每个字段创建索引。您应该做的是了解索引是如何工作的,以了解您应该创建哪些索引。
最好的办法是让您确定花费时间最长的查询,并为每个查询决定您是否必须创建索引,以及要创建哪个索引。
关于要创建什么索引的一些规则应该非常通用(在确定查询之后):
在任何情况下,SQL Server 都有一个工具,即 SQL Server Profiler,它可以帮助您决定哪些索引可以在您的应用程序中使用。
@Marcos 说得很好,我想以一种非常简单的方式解释索引的主题。
默认情况下,SQL Server 使用主键在表上创建索引。
很多时候这是需要的,但并非总是如此。
想想纸质电话簿:它按城市、姓氏和名字排列。我们可以说它的索引就是那些字段。通过这种方式查找号码很容易,因为这就是您通常要查找的内容。如果我想要城市“A”的所有数字,很容易得到它们。
现在,如果我想要所有名为“Juan Manuel”的人的号码会怎样?现在索引对我没有用。我必须一个接一个地把它们全部弄出来。
数据库也会发生同样的事情。重要的是索引是搜索最多的内容。
还有一个细节,在 SQL Server 中你可以有两种类型的索引。
我鼓励您对它们进行调查,看看什么最适合您的应用程序。
简而言之,我能说没有索引或创建不用于任何事情的索引是多么错误。正如@Marcos 向您解释的那样,这会使数据库因未使用的东西而过载。
我们在我公司通常做的是通过主键(用于连接)建立一个逻辑索引。索引通常由日期字段和主键聚集在一起。
1.- 除了您被告知的内容之外,我建议您将数据库优化顾问 (DETA) 与给您带来问题的查询一起使用。DETA 会为您提供改进数据库结构以提高查询效率的建议(有时它建议创建索引、统计信息等)。
2.- 你可以做的另一件事是分析执行计划并检测一些有趣的东西,比如顺序扫描(表扫描)而不是索引搜索(索引搜索)。
3.- 如果你想要一些非常一般的建议,那么也许看到这些在 SQL Server 中使用索引的技巧会对你有用。