#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.
Лучшим вариантом является создание индекса для значений без возможного поджаренного значения, а затем кластеризация по нему. Это должно дать вам что-то очень близкое к тому, что вы получили бы в противном случае.