2016-12-16 9 views
2

Я хочу создать временную таблицу, чтобы иметь возможность присоединить ее к нескольким таблицам, потому что объединение этих таблиц с содержимым предлагаемой временной таблицы занимает много времени (выборка временной таблицы занимает много времени. Повторение его снова и снова занимает все больше времени). Я удаляю временную таблицу, когда мои потребности будут выполнены. Я хочу знать, будут ли эти временные таблицы видны в течение другого сеанса клиента (мое требование - сделать их видимыми только для текущего сеанса клиента). Я использую postgresql. Было бы здорово, если бы вы предложили лучшие альтернативы решению, о котором я думаю.Являются ли временные таблицы в postgresql видимыми во всех клиентских сеансах?

+1

у вас есть два хороших ответа, но также иметь в виду, что в postgresql временные таблицы очень редко используются. Всегда есть лучший способ. – e4c5

+0

. Можете ли вы предложить, какой другой подход я могу взять? Я пробовал использовать CTE, но данные в CTE не сохраняются и, следовательно, они не дают значительного повышения производительности (в некоторых случаях, как и у меня, они могут ухудшают производительность). –

+0

Если у вас есть проблемы с производительностью, пожалуйста, прочитайте [postgresql-performance] (http://stackoverflow.com/tags/postgresql-performance/info), затем задайте новый вопрос со всей информацией, указанной в теге info –

ответ

0

Просьбы читают the documentation.

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

Если вы укажете ON COMMIT, временная таблица автоматически будет удалена в конце текущей транзакции.

Если вам нужна хорошая статистика таблицы во временной таблице, вы должны явно позвонить ANALYZE, так как эти статистические данные не собираются автоматически.

+0

Спасибо за ответ Launrenz. Фактически я был в замешательстве относительно того, на что эти сеансы действительно ссылаются. Являются ли эти сеансы БД или сеансами клиентов, так как сеанс БД может охватывать несколько клиентских сеансов, и если таблица видна для всего сеанса БД каждому клиенту (а не клиенту db), то это не полезно для меня. –

+0

Это сеанс базы данных. Если вы используете какой-то пул соединений, вам либо нужно явно удалить временную таблицу, когда вы закончите, либо выполняете свою работу в рамках одной транзакции и используйте «ON COMMIT» с временной таблицей. –

2

PostgreSQL - это база данных для вас. Временные таблицы выполняются лучше, чем стандарт. Из the docs,

Хотя синтаксис CREATE TABLE ВРЕМЕННЫЙ напоминает стандарт SQL, эффект не то же самое. В стандарте временные таблицы определяются только один раз и автоматически существуют (начиная с пустого содержимого) в каждом сеансе, который им нужен. PostgreSQL вместо этого требует, чтобы каждый сеанс выдавал собственную команду CREATE TEMPORARY TABLE для каждой временной таблицы, которая будет использоваться. Это позволяет различным сеансам использовать одно и то же имя временной таблицы для разных целей,, тогда как подход стандарта ограничивает все экземпляры заданного временного имени таблицы одинаковой структурой таблицы.

+0

Спасибо за ответ Evan. Фактически я был в замешательстве относительно того, на что эти сеансы действительно ссылаются. Эти сеансы БД или сеансы клиентов, так как сеанс БД может охватывать несколько клиентских сеансов, и если таблица видна для всего сеанса БД каждому клиенту (а не клиент db), это мне нехорошо. –

+1

Нет концепции сеансов клиентов. Есть только сеансы базы данных. Это * может быть проблемой на самом деле, если * ваш * клиент объединяет соединения. Это то, что вы принимаете во внимание.База данных не может видеть * вашу * концепцию клиентских сеансов. –