【发布时间】:2018-05-15 19:05:58
【问题描述】:
我查看了多个来源以获取有关 AND 语句、表连接等索引的信息,但是当存在 OR 语句时,我还没有找到很多有用的信息。话虽这么说,理想情况下,有人会如何为像这里这样的情况创建索引?
将 SQL 语句更新为不使用 like。
SELECT *
FROM table_name
WHERE table_name.field1 = 'criteria'
and (table_name.field2 = 1 or
table_name.field3 = 0)
显然,我想为field1 创建一个索引。但是,我是 include 字段 2 和 3 还是以其他方式处理此问题,我不确定。如果这是一个简单的三部分 AND 语句,我可能会使用 CREATE INDEX IND_index_name on table_name (field1, field2, field3),但我有理由相信这种逻辑与 OR 语句的工作方式不同。根据给出的陈述,我可以假设 field1 总是需要首先进行评估,但是我有多种方法可以处理这个问题。下面列出了我正在评估的潜在解决方案,但我不确定是否还有其他更好的解决方案。任何帮助将不胜感激!
CREATE INDEX IND_index_name on table_name (field1) INCLUDING (field2, field3)CREATE INDEX IND_index_name on table_name (field1, field2, field3)CREATE INDEX IND_index_name1 on table_name (field1, field2) CREATE INDEX IND_index_name2 on table_name (field1, field3)CREATE INDEX IND_index_name1 on table_name (field1) CREATE INDEX IND_index_name2 on table_name (field2) CREATE INDEX IND_index_name3 on table_name (field3)
作为附加信息,我无法访问 SQL Server Management Studio 工具,因为我使用的是 DBeaver。为了这个例子,我们假设在没有索引的情况下运行几乎需要一个完整的工作日。此处提交的答案将用于处理更大更复杂的查询,其中来自 table_name 的数据将用于在上面显示的查询之后运行的多个后续查询中。
【问题讨论】:
-
如果你在设计表,你应该只关心主键索引。如果您正在调整查询性能,这取决于负载,因此最好针对真实数据库进行调整。为此,您可以运行查询计划。在最新版本的 Microsoft SQL Server 中,该工具可以提供命中来创建响应特定低性能查询的索引
-
感谢 ByteArtisan。我很想使用 SQL Server 查询调优,但由于使用的数据库种类繁多,我处于使用 DBeaver 的环境中。我尝试调整的查询需要 4 小时才能完成,因为它比所示示例复杂得多。在这一点上,我需要了解在涉及 OR 语句时使用索引的最佳方式,以便我可以使用该信息进行适当的更改。
-
一般来说,你应该为索引选择最细粒度的字段。如果一个足以将搜索范围缩小到几条记录,那就足够了。首先在查询中使用索引字段也是一个好习惯。此外,您应该考虑每个索引的成本。像整数这样的小数据字段速度很快,并且会消耗更少的内存。此外,如果您正在编写查询,请尝试将索引字段放在首位,但引擎并不总是足够聪明以首先使用它们。希望够了。
-
在我的场景中,我正在查看大约 100,000,000 条记录,并且需要多次过滤 20 多个字段(大约 30 个)的组合以提取不同的数据集。我很欣赏对指数价值的考虑以及它们可能/可能不合适的程度。但是,我真的只需要知道如何使用 OR 语句适当地处理索引字段。这里的链接解释了 AND 语句要考虑的逻辑,但我还没有发现关于 OR 语句的任何类似的东西。 stackoverflow.com/questions/2155656/multiple-and-single-indexes
-
好吧,我认为可以肯定地说,在使用 or 时,SQL 引擎总是搜索这两个字段并合并结果。此外,由于字段如此之多,使用提示可能有助于引擎选择。如果统计信息没有更新,命中也很有用。不观察真实数据,做一些经验,很难给出解决方案,所以我只能提供一些原则。