0

NOT 'some string' = ANY(array_column)运行在同一查询中同时包含语句和语句的查询时,似乎会出现奇怪的性能下降ORDER BY

以下是一个简化的表结构,说明了taggerUUID 数组 (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 的否定时,事情才会变慢。任何帮助将不胜感激。

4

1 回答 1

1

只有 ORDER BY 的查询不应用任何过滤,当然它要快得多。

仅具有过滤 NOT ...ANY() 而没有 ORDER BY 的查询仅将过滤器应用于少量记录,直到达到 LIMIT 数(在本例中为 10)。

最后一个查询(使用 NOT & ANY 和 ORDER BY 过滤)要慢得多,因为它必须做更多的工作:它必须对表的所有记录应用过滤器,然后对它们进行排序,最后返回前 10 个(LIMIT) .

于 2017-05-03T13:38:35.143 回答