在简单的表上更正索引

时间:2013-11-25 10:17:45

标签: sql performance postgresql postgresql-9.1

我在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。排成问题或?

1 个答案:

答案 0 :(得分:0)

我讨厌带着如此多的批评来到这里,但我认为对你进行故障排除会非常困难。您有大量的数据类型错误会导致细微的错误和性能问题,并且GUID之后的命名表不是维护性的一般途径。

  1. 您需要根据需要将日期时间字段移动到时间戳或时间戳类型。作为文本字段,您将无法获得良好的性能。使用NULL而不是'None'

  2. 有关最大ID选择,请查看查询计划。我们无法在那里提供任何反馈。理想情况下使用VERBOSE并告诉它显示缓冲区使用情况。

  3. 您不需要regclass强制转换。放弃它。