У меня есть таблица в 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 млн. строк.
Вызов простой:
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 млн. строит проблему или?
это, возможно, поможет вам: http://stackoverflow.com/questions/11940515/postgres-performance-issues – funk
... Вы снимаете себе в ногу, используя тип символов на основе для хранения значения даты/времени (что '' None'' должно быть, должно быть, равно null). Кроме того, прочитайте [это сообщение в блоге] (http://sqlblog.com/blogs/aaron_bertrand/archive/2011/10/19/what-do-between-and-the-devil-have-in-common.aspx) для проблем, связанных с использованием 'BETWEEN' с отметками времени (сообщение специально относится к SQL Server, но логика применяется ко всем типам измерения/нецелого) –
Да, именно эти преобразования данных являются проблемой. Использование правильного типа данных является необходимым условием для производительности системы. –