如何在2000万行的海量数据集中提高排序性能?

问题描述 投票:0回答:1

我有一个运行速度非常慢的查询:

SELECT
    "conversation".*,
    "teamBotLocation"."id" AS "teamBotLocation.id",
    "teamBotLocation"."name" AS "teamBotLocation.name"
FROM
    "conversation" AS "conversation"
    LEFT OUTER JOIN "teamBotLocation" AS "teamBotLocation" ON "conversation"."teamBotLocationId" = "teamBotLocation"."id"
WHERE
    "conversation"."teamBotId" = 'some_id'
    AND "conversation"."teamBotLocationId" IN ('some_id','some_id')
    AND "conversation"."isDeleted" = false
    AND "conversation"."isBlocked" = false
    AND "conversation"."isBroadcast" = false
    AND "conversation"."isGroup" = false
ORDER BY
     CASE
         WHEN "firstName" = '' THEN NULL
         ELSE 0
     END ASC NULLS LAST,
    "conversation"."firstName" NULLS LAST,"conversation"."id" DESC
LIMIT
    10 OFFSET 100;

这个查询实际上做了什么?

我有一个包含近 2000 万行的对话表。我将所有这些对话显示在一个默认限制为 10 的表格中。我们按这 5 列

firstName
lastName
phone
email 
createdAt
按升序/降序对表格进行排序.

我目前正在生产中使用此查询。对于较少数量的结果,执行时间低于一秒,这很好。但是,当结果数以百万计(假设为 100 万)时,执行时间就太慢了,大约需要 10 秒。我发现缓慢的主要原因是排序。

这是我的查询计划:

Query plan

我需要一个在 1-2 秒内执行查询的解决方案,请记住,可以按升序或降序对这 5 列进行排序:

firstName
lastName
phone
email
createdAt

注意

  1. 如果任何行在特定列中具有空字符串,则在排序时应将该行保留在最后。
  2. 请记住,所有这些对话都属于一对一映射中的不同帐户。因此从技术上讲,此查询是针对特定帐户的。此外,每个帐户可以有不同的位置。所以对话也与这些位置有一对一的映射。
postgresql indexing sql-execution-plan
1个回答
0
投票

您可以首先对firstName列进行排序,限制为10,然后再对结果表与其他四列进行排序 对 10 行进行排序要快得多

© www.soinside.com 2019 - 2024. All rights reserved.