![]() |
1
4
也许这会有助于写:
或者简单地
PostgreSQL应该能够确定范围操作的选择性非常高,并考虑使用索引。 我认为它不能直接使用索引来满足不等于谓词,但是如果它可以在计划期间尝试像上面那样重新编写不等于谓词(如果它有帮助的话),那就更好了。如果可行,请向开发人员建议;) 理由:在索引中搜索不等于某个值的所有值需要扫描完整索引。相反,搜索少于某个键的所有元素意味着在树中找到最大的不匹配项并向后扫描。同样,在相反的方向上搜索所有大于某个键的元素。这些操作使用B树结构很容易实现。此外,PostgreSQL收集的统计数据应该能够指出“+33 1234567”是一个已知的频繁值:通过从1中删除那些和空值的频率,我们可以选择剩余的行的比例:柱状图边界将指示这些行是否偏向一边。但是如果排除空值和频繁的值会使行的比例保持在足够低的水平(ISR大约为20%),那么索引扫描应该是合适的。检查pg_stats中该列的统计信息,查看它实际计算的比例。 更新 :我在一个分布类似的本地表上尝试了这个方法,上面的两种形式都产生了一个普通的seq扫描以外的结果。后者(使用“或”)是一种位图扫描,如果对公共值的偏差特别大,它实际上可能会变成一种序列扫描。虽然规划人员可以看到,但我认为它不会自动重写为“内部附加(索引扫描,索引扫描)”。关闭“启用位图扫描”使其恢复到顺序扫描。
聚苯乙烯
:如果数据库位置不是C,则为文本列编制索引和使用不等式运算符可能是一个问题。您可能需要添加一个使用文本模式或varchar模式的额外索引;这类似于为
替代方案 :可以创建部分索引:
这将使
|
![]() |
2
5
数据库可以使用此查询的索引,但它选择不使用,因为这样会变慢。 更新 :这并不完全正确:您必须稍微重写查询。见Araqnid的答案。
WHERE子句几乎选择表中的所有行(行=999999)。在这种情况下,数据库可以看到表扫描速度更快,因此忽略了索引。因为柱子比较快
如果有不同类型的数据,其中值最多
任何选择近100万行的查询都会很慢。尝试添加限制子句。 |
![]() |
Community wiki · SQL语法新手 1 年前 |
|
KateMak · 是否将多行中的多列与唯一id组合? 1 年前 |
![]() |
Karuna · SQL中列内的筛选器[重复] 1 年前 |
![]() |
Irvan Affandy · 为另一个选择选择声明的键 1 年前 |
![]() |
Community wiki · 这个MySQL语句出了什么问题? 1 年前 |
![]() |
Community wiki · 优化从同一表中提取的多列的查询 1 年前 |