为什么使用yb_hash_code() DELETE查询会降低YugabyteDB的性能?



[用户在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是一个写操作,因此,查询计划包括:

  1. 查找给定WHERE子句的分片
  2. 在分片leader上执行查询
  3. 在shard follower上复制更改
  4. 响应客户端
  5. 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

相关内容

  • 没有找到相关文章

最新更新