关于SQL中的索引的几个问题,特别是tsql

时间:2014-09-24 05:48:24

标签: sql sql-server tsql indexing

情景1:

我在(OrderDate, Country, OrderStatus

上有一个非聚集索引

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

情景2:

我在OrderDateCountryOrderStatus

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

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

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

由于

ETA:只是要添加,这是针对具有约30种不同过滤器的典型订单搜索页面。

1 个答案:

答案 0 :(得分:2)

对场景1的回答实际上比这更复杂。

它也归结为从搜索'中选择的内容。以及数据如何在表中分发。但是看到这是101,我不会深入其中。

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

如果您SELECT *或以其他方式选择了许多不在索引中的列,而首先使用OrderDate,那么它可能不会使用您的索引,因为其他索引更好 - 或者根据数据,它会对您的索引执行seek,并结合键查找。 这就是它可以变得更复杂的地方,但是我无法记住我头顶的确切数字。

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

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

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

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