R dplyr 查询在 PostgreSQL 中不使用表索引?

标签 r postgresql dplyr

我想使用 R 笔记本通过 dplyr 包连接到远程 PostgreSQL 数据库。
问题是 R 函数很慢,当我查看执行计划时,我看到它没有使用表的索引,但是如果我在 PostgreSQL 中运行相同的查询,它会快得多,因为使用了索引。
在 R 中:

q <- tbl(con, "mytable")%>%
    filter(a==1000, b>500)%>%
    select(id) %>%
    explain()

#<SQL>
#SELECT "id"
#FROM "mytable"
#WHERE (("a" = 1000.0) AND ("b" > 500.0))
#
#<PLAN>
#Seq Scan on mytable
#  Filter: (((b)::numeric > 500.0) AND ((a)::numeric = 1000.0))
在同一个 R 笔记本中,但在 SQL 块中:
{sql connection=con}
EXPLAIN ANALYZE SELECT id FROM mytable WHERE a=1000 AND b>500;

#Bitmap Heap Scan on mytable 
#Recheck Cond: (a = 1000)
#Filter: (b > 500)
#Rows Removed by Filter: 44963
#Heap Blocks: exact=390
#-> Bitmap Index Scan on idx_mytable_a
#Index Cond: (a = 1000)
为什么使用相同的连接时计划不同?
更新
R 函数解释 10001000.0这就是差异的原因:
{sql connection=con}
EXPLAIN ANALYZE SELECT id FROM mytable WHERE a=1000.0 AND b>500.0;

#Seq Scan on mytable
#  Filter: (((b)::numeric > 500.0) AND ((a)::numeric = 1000.0))
如何避免这种转换?

最佳答案

回答我自己的问题,但也很好奇看到更优雅的解决方案。
如果我明确说将数字解释为整数,它将使用索引:

q <- tbl(con, "mytable")%>%
    filter(a==as.integer(1000), b>500)%>%
    select(id) %>%
    explain()

#<SQL>
#SELECT "id"
#FROM "mytable"
#WHERE (("a" = CAST(1000.0 AS INTEGER)) AND ("b" > 500.0))
#
#<PLAN>
#Bitmap Heap Scan on mytable
#  Recheck Cond: (a = 1000)
#  Filter: ((b)::numeric > 500.0)
#  ->  Bitmap Index Scan on idx_mytable_a
#        Index Cond: (a = 1000)

关于R dplyr 查询在 PostgreSQL 中不使用表索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67037583/

相关文章:

r dplyr group_by 值折叠和粘贴

sql - Postgres 仅在行数低于限制时才插入行

r - "dplyr"不知道分开

R:使用 dplyr 创建有条件的新变量

r - 独特的人体计数栏

regex - R中的正则表达式删除第一个空格后的所有字符?

r - 按字母顺序在两列中创建组合信息的新列

r - 匹配同一数据框上另一列范围内的列中的值并返回相应的行

sql - 不区分大小写的搜索/查询

sql - 条件唯一约束