[用户在YugabyteDB社区Slack上发布的问题]
对于下面的schema:
CREATE TABLE IF NOT EXISTS public.item_data
(
item_id uuid NOT NULL,
id2 integer NOT NULL,
create_date timestamp without time zone NOT NULL,
modified_date timestamp without time zone NOT NULL,
CONSTRAINT item_data_pkey PRIMARY KEY (item_id, id2)
);
我们有48个yugabyte设置的平板电脑。所以,第一个哈希范围是[0,1395)
下面是DELETE查询的执行次数:
查询1(使用yb_hash_code()
):
EXPLAIN ANALYZE DELETE FROM item_data x WHERE yb_hash_code(x.item_id)>=0 and yb_hash_code(x.item_id)<1395 and x.item_id = any in the arrayOfItemIds - taking 2 seconds of execution time
查询2:
EXPLAIN ANALYZE DELETE FROM item_data x WHERE x.item_id = any in the listOfItemIds - taking 2 milli seconds of execution time
DELETE
是一个写操作,因此,查询计划包括:
- 查找给定WHERE子句的分片
- 在分片leader上执行查询
- 在shard follower上复制更改
- 响应客户端 WHERE子句中的
yb_hash_code()
应该避免步骤1,对吗?
为什么查询2比查询1快?尽管查询1使用了yb_hash_code()
在这里,因为item_id
是主键,所以YugabyteDB确定正确的tablet,因此您不需要使用散列代码进行过滤。
但是您是对的,添加标准不应该增加更多的工作。执行计划显示。我的猜测是,您看到由索引重新检查删除的行大约有1/48行在那里。这意味着当hash_code上有谓词时,另一个谓词不会被下推。
这里有一个问题:https://github.com/yugabyte/yugabyte-db/issues/12094