我有下一个包含数据的表格:
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
答案 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)
好的,我会给你一些提示
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
您也可以尝试添加一些索引,但如果表只包含这 3 列,我不确定您可以改进多少。根据数据分布情况,比如你知道parsing_status有一半是null,你可以试试:
create index idx_xml_files_2 on xml_files("parsing_status", "purchaseNumber")