gpt4 book ai didi

sql - 为 SQL Server 中的常用查询创建适当的索引

转载 作者:太空狗 更新时间:2023-10-30 01:47:41 26 4
gpt4 key购买 nike

在我的应用程序中,我有两个非常频繁使用的查询。这些查询的 Where 子句如下:

WHERE FieldA = @P1 AND (FieldB = @P2 OR FieldC = @P2)

WHERE FieldA = @P1 AND FieldB = @P2

P1P2 是在 UI 中输入的参数或来自外部数据源的参数。

  • FieldA 是一个 int 并且高度不唯一,这意味着:在一个表中只有两个、三个、四个不同的值,比如 20000 行
  • FieldB 是一个 varchar(20) 并且“几乎”是唯一的,FieldB 可能具有相同值的行很少
  • FieldC 是一个varchar(15),也非常不同,但不如 FieldB
  • FieldA 和 FieldB 一起是唯一的(但不构成我的主键,它是一个带有聚集索引的简单自动递增标识列)

我现在想知道定义索引以专门加速这两个查询的最佳方法是什么。我应该用...定义一个索引吗?

FieldB (or better FieldC here?)
FieldC (or better FieldB here?)
FieldA

...或者更好的两个索引:

FieldB
FieldA

FieldC
FieldA

或者还有其他更好的选择吗?什么是最好的方法,为什么?

提前感谢您的建议!

编辑:

作为给其他读者的信息:这是另一个答案,现在已被删除。实际上答案对我来说似乎非常有用。建议是创建两个索引(根据我上面的第二个选项)并通过使用两个选择语句(一个带有 WHERE FieldA = @P1 AND FielDB = @P2 和一个 WHERE FieldA = @P1 AND FieldC = @P2) 而不是 OR 以从两个索引中受益(事实并非如此与 OR 运算符)。

编辑2:

关于不使用 OR 索引和 UNION 更可取的说法似乎是错误的 - 至少根据我自己的测试(见下面我自己的回答)。

最佳答案

扩展 Remus 的(编辑:现已删除)答案...

  • 如果@p2 是 varchar(15) 那么你不能可靠地与 FielDB 进行比较,它是 varchar(20)
  • 如果@p2 是 varchar(20),则 FieldC 将被转换为 varchar(20) 并且不使用索引(或最多扫描它)
  • 如果@p1 只有 2、3、4 个值,那么为什么不用 tinyint 并减少表/索引的大小?

在您解决此数据类型优先级问题之前,我不会费心索引:这是在 OR 子句问题之上。

最后,列是唯一的还是非唯一的:没有中间值。此处统计数据有助于选择性,但无关紧要。

由于 FieldA 的选择性,我会将 Remus 的答案中的索引反转为 FieldB、FieldA(并且是唯一的)和 FieldC、FieldA

编辑,评论后:您不能将 @p2 的使用与常量字符串的使用进行比较。

关于sql - 为 SQL Server 中的常用查询创建适当的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3033079/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com