如何提高查询速度?

时间:2020-12-29 13:36:21

标签: sql postgresql

我有下一个包含数据的表格:

uvicorn mtg_django.asgi:application --reload --debug --ws websockets

数据:

CREATE TABLE xml_files ( 
    "parsing_status" Character Varying( 150 ),
    "purchaseNumber" Character Varying( 2044 ),
    "docPublishDate" Timestamp With Time Zone );
 ;

purchaseNumber parsing_status docPublishDate 0373200554017000226 null 2017-07-28 19:00:10.885+03 0373200554017000226 null 2017-07-28 19:08:30.346+03 0373200554017000226 null 2017-07-28 19:24:35.265+03 0373400005317002182 null 2017-07-28 19:45:02.162+03 0348100035117000082 null 2017-07-28 20:08:26.37+03 0373200554017000292 null 2017-07-28 20:10:24.312+03 0373200081217000531 null 2017-07-28 20:13:56.166+03 0373200041517000400 null 2017-07-28 21:23:20.616+03 0373200081217000531 null 2017-07-29 08:18:29.571+03 0373200081217000531 null 2017-07-29 09:34:11.545+03 0373100026117000078 null 2017-07-29 10:37:01.161+03 0573400000117001086 null 2017-07-29 11:25:37.863+03 0573400000117001096 null 2017-07-29 11:30:36.499+03 0373200081217000531 null 2017-07-29 12:14:04.033+03 0573400000117001118 null 2017-07-29 14:50:34+03 0573400000117001118 null 2017-07-29 16:49:12.457+03 0373100026117000080 null 2017-07-29 16:52:02.013+03 0373100026117000080 null 2017-07-29 17:05:40.981+03 0373100026117000080 null 2017-07-29 17:13:29.532+03 0373200554017000226 null 2017-07-29 18:55:47.488+03 有重复项。 我需要选择处理所有最新的未解析记录。我正在使用下一个 SQL:

purchaseNumber

在有数百万行的表上查询需要很长时间的问题。 我怎样才能提高速度? 这是数据示例:https://www.db-fiddle.com/f/vycMHGLYML5K56SN77HLsY/0

2 个答案:

答案 0 :(得分:2)

对于您的查询,您需要 xml_files("purchaseNumber", "docPublishDate" desc) 上的索引:

create index idx_xml_files_2 on xml_files("purchaseNumber", "docPublishDate" desc)

Postgres 应该为 order by 使用这个索引,这有助于 distinct on

虽然它不会影响性能,但我还是建议将 where 子句简化为:

where parsing_status IS NULL 

答案 1 :(得分:1)

好的,我会给你一些提示

1.改进查询

SELECT t1.purchaseNumber, t1.parsing_status, t1.docPublishDate
FROM xml_files t1
LEFT JOIN xml_files t2
  ON t1.purchaseNumber = t2.purchaseNumber
  AND t1.docPublishDate < t2.docPublishDate
WHERE t1.parsing_status IS NULL 
AND t2.parsing_status IS NULL 
AND t2.docPublishDate IS NULL

2.改进表格

您也可以尝试添加一些索引,但如果表只包含这 3 列,我不确定您可以改进多少。根据数据分布情况,比如你知道parsing_status有一半是null,你可以试试:

create index idx_xml_files_2 on xml_files("parsing_status", "purchaseNumber")