我在PostgreSQL 9.1中有一个表:
_id | integer | not null default nextval('"01f9073e-e6b8-46bf-882f-9a4cd0a69a66__id_seq"'::regclass)
_full_text | tsvector |
tlRecordID | text |
tlPDM | text |
tlPayDateTime | text |
tlExpDateTime | text |
Indexes:
"01f9073e-e6b8-46bf-882f-9a4cd0a69a66_pkey" PRIMARY KEY, btree (_id)
"01f9073e-e6b8-46bf-882f-9a4cd0a69a66_tlRecordID_idx" UNIQUE, btree ("tlRecordID")
"01f9073e-e6b8-46bf-882f-9a4cd0a_tlPayDateTime_tlExpDateTime_idx" btree ("tlPayDateTime", "tlExpDateTime")
有~35 mio。行。
打电话给一个简单的:
SELECT MAX("tlRecordID"::integer) AS max_id FROM "01f9073e-e6b8-46bf-882f-9a4cd0a69a66";
需要很长时间。此外,还有更高级的查询,例如:
FROM "01f9073e-e6b8-46bf-882f-9a4cd0a69a66"
WHERE "tlPayDateTime" != 'None' AND "tlExpDateTime" != 'None' AND
NOW() BETWEEN "tlPayDateTime"::timestamp AND "tlExpDateTime"::timestamp GROUP BY "tlPDM"
经常超时等等。
任何人都可以帮助优化数据库吗?是35 mio。排成问题或?
答案 0 :(得分:0)
我讨厌带着如此多的批评来到这里,但我认为对你进行故障排除会非常困难。您有大量的数据类型错误会导致细微的错误和性能问题,并且GUID之后的命名表不是维护性的一般途径。
您需要根据需要将日期时间字段移动到时间戳或时间戳类型。作为文本字段,您将无法获得良好的性能。使用NULL而不是'None'
有关最大ID选择,请查看查询计划。我们无法在那里提供任何反馈。理想情况下使用VERBOSE并告诉它显示缓冲区使用情况。
您不需要regclass强制转换。放弃它。