2013-11-25 2 views
0

У меня есть таблица в 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 млн. строит проблему или?

+0

это, возможно, поможет вам: http://stackoverflow.com/questions/11940515/postgres-performance-issues – funk

+4

... Вы снимаете себе в ногу, используя тип символов на основе для хранения значения даты/времени (что '' 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, но логика применяется ко всем типам измерения/нецелого) –

+3

Да, именно эти преобразования данных являются проблемой. Использование правильного типа данных является необходимым условием для производительности системы. –

ответ

0

Ненавижу приходить сюда с таким количеством критических замечаний, но я думаю, что устранение неполадок, как вы выразились, будет очень тяжело. У вас есть значительные ошибки в типах данных, которые приведут к тонким ошибкам и проблемам с производительностью, а также присвоение имен таблицам после GUID не является общей дорогой для удобства обслуживания.

  1. Вам необходимо перенести ваши поля datetime в типы timestamp или timestamptz в зависимости от того, что вы хотите. Вы не получите хорошую производительность с ними в виде текстовых полей. Используйте NULL вместо «None»

  2. Для вашего выбора максимального id просмотрите планы запросов. Мы не можем предоставить никаких отзывов. В идеале используйте VERBOSE и скажите, чтобы он также показывал использование буфера.

  3. Вам не нужен литье рекласса. Брось это.

Смежные вопросы