【发布时间】:2021-07-26 15:45:57
【问题描述】:
谁能解释或建议我们可以在 Postgres 中使用 split_part 而不是 like。
在我的用例中,名称列将包含一些中间字符串,这对于特定类别是常见的。比如Vinod.Game1、Vinod.Game2、Vinod.Game3等
现在我想获取 Vinod 玩过的游戏数量及其详细信息。 我有两个选择:
select * from games where name like 'Vinod.Game%'
或
select * from games where split_part(name, '.Game', 1) = 'Vinod'
当我检查 200 行的数据时,我看到了 beloe stats
对于 Like 查询:
Planning time: 120.326 ms
Execution time: 2.878 ms
对于 split_part 查询:
Planning time: 8.845 ms
Execution time: 3.681 ms
您能否帮助我了解计划时间对查询的影响。如果我们有千兆数据库,哪个更好用(split_part vs like)?
Table "public.games"
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
------------------+-----------------------+-----------+----------+------------------------+----------+--------------+-------------
id | character varying(32) | | not null | | extended | |
access | character varying(50) | | | | extended | |
deleted | character varying(1) | | | 'N'::character varying | extended | |
timePlayed | character varying(50) | | | | extended | |
description | character varying | | | | extended | |
name | character varying(64) | | | | extended | |
【问题讨论】:
-
这看起来很不寻常。这是可重复的吗?表是如何定义的?
-
尝试在
(name)上建立索引。LIKE可以在通配符仅在末尾时使用。 -
表架构更新了,可重复是什么意思?
-
@VinodKumarChaganti 。 . .小表上的计时(例如 200 行)通常不可重现或特别有意义。尝试一百万行。
-
当我尝试使用 dbfiddle (dbfiddle.uk/…) 时,我发现
like通常很快,但实际上并不是很多。有时split_part()会获胜。我认为这只是意味着split_part()有一个有效的实现。我会去有三个原因:(1)它是标准的; (2) 它通常性能更好; (3) 在某些情况下它可以使用索引。
标签: sql postgresql performance sql-like