PostgreSQL — Кластеризация никогда не завершается — длинный ключ?

#postgresql #database-cluster

#postgresql #база данных-кластер

Вопрос:

У меня возникли проблемы с кластеризацией таблицы, где ключ состоит из одного поля char (23) и двух полей временных меток. Поле char (23) содержит буквенно-цифровые значения. Операция кластеризации никогда не завершается. Я позволил ему работать в течение 24 часов, и он все еще не завершился.

Кто-нибудь сталкивался с подобной проблемой раньше? Имеет ли смысл моя теория о том, что причина в поле длинного ключа? Мы имели дело с гораздо большими таблицами, у которых нет длинных ключей, и мы всегда могли выполнять операции с БД над ними без каких-либо проблем. Это заставляет меня думать, что в данном случае это может быть связано с размером ключа.

Комментарии:

1. Что именно представляет собой «операция кластеризации»? Пожалуйста, покажите нам (полный) SQL, который вы используете.

2. сколько строк? символ (23) и две временные метки на самом деле не «длинные»

3. В таблице около 78,5 миллионов записей. Всего в нем 25 полей, включая 3 поля, участвующих в ключе, как описано ранее. В нем также есть поле VARCHAR (64000). Выполняемый мной запрос «кластер <имя_таблицы>, использующий <индекс с ключом>»

4. Попробуйте выполнить поиск в pg_stat_activity, если запрос действительно выполняется … скорее всего, запрос зависает на блокировке (проверьте столбец «ожидание»)

Ответ №1:

Кластер переписывает таблицу, поэтому она должна ожидать блокировок. Возможно, что он никогда не получает необходимую блокировку. Почему вы устанавливаете varchar (64000)? Почему бы просто не использовать неограниченный varchar? И насколько велик этот индекс?

Если размер является проблемой, он должен основываться на размере индекса, а не на размере ключа. Я не знаю, как влияют атрибуты toasted key на кластер, потому что они перемещены в расширенное хранилище. ТОСТ может усложнить КЛАСТЕР, и я никогда не слышал о том, чтобы кто-либо кластеризовался по атрибуту TOASTed. В этом не было бы особого смысла. Поджаривание необходимо для любого атрибута размером более 4k.

Лучшим вариантом является создание индекса для значений без возможного поджаренного значения, а затем кластеризация по нему. Это должно дать вам что-то очень близкое к тому, что вы получили бы в противном случае.