- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的应用程序中,我有两个非常频繁使用的查询。这些查询的 Where 子句如下:
WHERE FieldA = @P1 AND (FieldB = @P2 OR FieldC = @P2)
和
WHERE FieldA = @P1 AND FieldB = @P2
P1
和 P2
是在 UI 中输入的参数或来自外部数据源的参数。
int
并且高度不唯一,这意味着:在一个表中只有两个、三个、四个不同的值,比如 20000 行varchar(20)
并且“几乎”是唯一的,FieldB 可能具有相同值的行很少varchar(15)
,也非常不同,但不如 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 的(编辑:现已删除)答案...
在您解决此数据类型优先级问题之前,我不会费心索引:这是在 OR 子句问题之上。
最后,列是唯一的还是非唯一的:没有中间值。此处统计数据有助于选择性,但无关紧要。
由于 FieldA 的选择性,我会将 Remus 的答案中的索引反转为 FieldB、FieldA
(并且是唯一的)和 FieldC、FieldA
编辑,评论后:您不能将 @p2 的使用与常量字符串的使用进行比较。
关于sql - 为 SQL Server 中的常用查询创建适当的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3033079/
这段代码在 Java 中的等价物是什么?我放了一部分,我对 I/O 部分感兴趣: int fd = open(FILE_NAME, O_WRONLY); int ret = 0; if (fd =
我正在尝试将维度为 d1,d2,d3 的张量 M[a1,a2,a3] reshape 为维度为 d2, d1*d3 的矩阵 M[a2,a1*a3]。我试过 M.reshape(d2,d1*d3) 但是
我是一名优秀的程序员,十分优秀!