NOT 'some string' = ANY(array_column)
运行在同一查询中同时包含语句和语句的查询时,似乎会出现奇怪的性能下降ORDER BY
。
以下是一个简化的表结构,说明了tagger
UUID 数组 (v4) 的行为:
CREATE TABLE IF NOT EXISTS "doc"."test" (
"id" STRING,
"last_active" TIMESTAMP,
"taggers" ARRAY(STRING)
)
数组可能会变得有点大taggers
,可能有数百个,在某些情况下有数千个单独的字符串。
以下查询都非常高效并在 0.03 秒内解决:
SELECT id FROM test ORDER BY last_active DESC LIMIT 10;
SELECT id FROM test WHERE NOT ('da10187a-408d-4dfc-ae46-857fd23a574a' = ANY(taggers)) LIMIT 10;
SELECT id FROM test WHERE ('da10187a-408d-4dfc-ae46-857fd23a574a' = ANY(taggers)) ORDER BY last_active DESC LIMIT 10;
但是,在查询中包含这两个部分会跳转到大约 2 - 3 秒:
SELECT id FROM test WHERE NOT ('da10187a-408d-4dfc-ae46-857fd23a574a' = ANY(taggers)) ORDER BY last_active LIMIT 10;
非常奇怪的是,在前面的快速运行查询列表中,最后一个与慢速查询几乎完全相同,只是没有否定。否定的ANY
也很快。只有在限制组合中添加 ANY 的否定时,事情才会变慢。任何帮助将不胜感激。