【问题标题】:A couple of 101 questions about indexes in SQL, specifically tsql关于 SQL 中索引的几个 101 个问题,特别是 tsql
【发布时间】:2014-09-24 05:48:23
【问题描述】:

场景 1:

我在 (OrderDate, Country, OrderStatus) 上有一个非聚集索引

我想如果我按OrderDateOrderDate/CountryOrderDate/Country/Status 搜索,那么可以使用该索引。如果我只是通过OrderDate/OrderStatusOrderStatus 搜索呢?

场景 2:

我在 OrderDateCountryOrderStatus 上有 3 个单独的非聚集索引

如果我的查询涉及所有 3 个列,那么它可以利用所有 3 个索引吗?我的意思是,在使用它选择的最佳索引进行过滤之后,它可以利用其他 2 个索引吗?

这些信息将帮助我不要过度实施索引。

谢谢

预计到达时间:补充一下,这是一个典型的订单搜索页面,包含大约 30 个不同的过滤器。

【问题讨论】:

  • 对于场景 1:搜索 ON OrderDate/OrderStatus 可能使用索引 - 用于 OrderDate。但仅在 OrderStatus 上的搜索不能使用索引。如果正在搜索该索引中的 n 最左列(其中 n >= 1),则可能使用复合索引
  • 谢谢,这符合我对场景 1 的看法
  • @marc_s:实际上只有OrderStatus可以使用索引。如果您需要比索引中更多的信息,它会扫描它并使用查找。

标签: sql sql-server tsql indexing


【解决方案1】:

场景 1 的答案实际上比这要复杂一些。

这也归结为从“搜索”中选择的内容以及数据在表中的分布方式。但鉴于这是 101,我不会深入探讨它。

基本上 - 如果您选择索引中包含的列,首先使用OrderDate,并且只选择索引中包含的列(即索引中的列和包含的列),它将使用您指定的索引和它应该能够执行seek(查找数据的最快方式,因为它可以通过索引查找正确的叶节点)

如果您SELECT * 或以其他方式选择很多不在您的索引中的列,首先使用OrderDate,那么它可能不会使用您的索引,因为另一个索引更好 - 或者取决于它的数据'将在您的索引上执行seek,并结合键查找。 这就是它可能变得更加复杂的地方,但我无法记住我脑海中的确切数字。

如果您选择使用OrderStatus 然后再次取决于您实际选择的内容,您可以使用或不使用索引。但是当使用索引时,它会scan 它,因为它无法搜索。
扫描意味着遍历索引中的每个叶节点
再一次 - 如果不是从索引中选择数据,它可能会结合键查找来获取索引中不包含的数据。

我希望这对场景 1 有所帮助。否则,我建议您转到 https://dba.stackexchange.com/ 以获取更多与数据库相关的受众。

至于您如何提及您的方案 2;那么简短的回答是,如果您的查询涉及所有 3 个索引,除非您的查询是使用联合或其他临时结构(公用表表达式等)构建的,否则它不会充分利用所有 3 个索引。

优化器可能会将索引查询连接在一起,但更多 通常,您更有可能仅使用一个索引来查看它。

【讨论】:

  • 不确定您在场景 2 中的陈述:查询优化器可以结合多个索引来加快搜索速度 ....
  • 它需要 - 如前所述 - 关于查询的更多信息才能确定地说明它。但是,是的,你是对的 - 它可以。我会修改我的答案
  • @Allan,我将选择更多列。我在我的问题中添加了一个 ETA,说这是一个订单搜索页面。我会搜索你的一些术语,看看我是否还有其他问题。
猜你喜欢
  • 1970-01-01
  • 2011-11-02
  • 2011-05-12
  • 2011-08-24
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多