postgresql - Postgresql 数组函数不使用索引
问题描述
我已经创建了一个带有 GIN 索引的 postgresql 数组列,并且我正在尝试对该列执行包含查询。使用标准的 postgresql,我可以像这样正常工作:
SELECT d.name
FROM deck d
WHERE d.card_names_array @> string_to_array('"Anger#2","Pingle Who Annoys#2"', ',')
LIMIT 20;
解释分析:
Limit (cost=1720.01..1724.02 rows=1 width=31) (actual time=7.787..7.787 rows=0 loops=1)
-> Bitmap Heap Scan on deck deck0_ (cost=1720.01..1724.02 rows=1 width=31) (actual time=7.787..7.787 rows=0 loops=1)
Recheck Cond: (card_names_array @> '{"\"Anger#2\"","\"Pingle Who Annoys#2\""}'::text[])
-> Bitmap Index Scan on deck_card_names_array_idx (cost=0.00..1720.01 rows=1 width=0) (actual time=7.785..7.785 rows=0 loops=1)
Index Cond: (card_names_array @> '{"\"Anger#2\"","\"Pingle Who Annoys#2\""}'::text[])
Planning time: 0.216 ms
Execution time: 7.810 ms
不幸的是(在这种情况下)我正在使用QueryDSL@>
,我使用它来读取无法使用的本机数组函数。但是,这个答案说你可以用arraycontains
它来做同样的事情。我得到了它,它返回了正确的结果,但它不使用我的索引。
SELECT d.name
FROM deck d
WHERE arraycontains(d.card_names_array, string_to_array('"Anger#2","Pingle Who Annoys#2"', ','))=true
LIMIT 20;
解释分析:
Limit (cost=0.00..18.83 rows=20 width=31) (actual time=1036.151..1036.151 rows=0 loops=1)
-> Seq Scan on deck deck0_ (cost=0.00..159065.60 rows=168976 width=31) (actual time=1036.150..1036.150 rows=0 loops=1)
Filter: arraycontains(card_names_array, '{"\"Anger#2\"","\"Pingle Who Annoys#2\""}'::text[])
Rows Removed by Filter: 584014
Planning time: 0.204 ms
Execution time: 1036.166 ms
这是我创建布尔表达式的 QueryDSL 代码:
predicate.and(Expressions.booleanTemplate(
"arraycontains({0}, string_to_array({1}, ','))=true",
deckQ.cardNamesArray,
filters.cards.joinToString(",") { "${it.cardName}#${it.quantity}" }
))
有没有办法让它使用我的索引?或者使用 QueryDSL 使用本机@>
功能的不同方法?
解决方案
推荐阅读
- r - 按ggplot中的另一个变量排序条形图
- sql - 数据工厂 polybase - 零行复制到接收器
- c# - 为什么 C# 空条件运算符不使用重载的相等运算符?
- javascript - jQuery 侧边栏会切换,但不会后退
- c# - EF Core 2.x - IQueryable 扩展正在客户端而不是数据库上进行评估
- wpf - WPF 弱订阅 IsEnabledChanged 事件
- c# - 使用单个游戏对象变量在克隆的预制件之间切换
- javascript - 在接受托管方法 (Authorize.net) 中将 showReceipt 设置为 false 时没有交易响应
- ubuntu-18.04 - 在 Singularity 容器中安装 TinyTeX
- python - Keras:使用 predict_generator 预测新值