diff --git a/src/database/postgres.js b/src/database/postgres.js index b8f4e4e90a..df1ccf8784 100644 --- a/src/database/postgres.js +++ b/src/database/postgres.js @@ -366,15 +366,18 @@ postgresModule.initSessionStore = function (callback) { db.query(` CREATE TABLE IF NOT EXISTS "session" ( - "sid" VARCHAR NOT NULL - COLLATE "default", - "sess" JSON NOT NULL, - "expire" TIMESTAMP(6) NOT NULL, - CONSTRAINT "session_pkey" - PRIMARY KEY ("sid") - NOT DEFERRABLE - INITIALLY IMMEDIATE -) WITH (OIDS=FALSE)`, function (err) { + "sid" CHAR(32) NOT NULL + COLLATE "C" + PRIMARY KEY, + "sess" JSONB NOT NULL, + "expire" TIMESTAMPTZ NOT NULL +) WITHOUT OIDS; + +CREATE INDEX IF NOT EXISTS "session_expire_idx" ON "session"("expire"); + +ALTER TABLE "session" + ALTER "sid" SET STORAGE MAIN, + CLUSTER ON "session_expire_idx";`, function (err) { if (err) { return callback(err); } diff --git a/src/upgrades/1.10.2/postgres_sessions.js b/src/upgrades/1.10.2/postgres_sessions.js new file mode 100644 index 0000000000..b77a3f9b92 --- /dev/null +++ b/src/upgrades/1.10.2/postgres_sessions.js @@ -0,0 +1,41 @@ +'use strict'; + +var db = require('../../database'); +var nconf = require('nconf'); + +module.exports = { + name: 'Optimize PostgreSQL sessions', + timestamp: Date.UTC(2018, 9, 1), + method: function (callback) { + if (nconf.get('database') !== 'postgres' || nconf.get('redis')) { + return callback(); + } + + db.pool.query(` +BEGIN TRANSACTION; + +CREATE TABLE IF NOT EXISTS "session" ( + "sid" CHAR(32) NOT NULL + COLLATE "C" + PRIMARY KEY, + "sess" JSONB NOT NULL, + "expire" TIMESTAMPTZ NOT NULL +) WITHOUT OIDS; + +CREATE INDEX IF NOT EXISTS "session_expire_idx" ON "session"("expire"); + +ALTER TABLE "session" + ALTER "sid" TYPE CHAR(32) COLLATE "C", + ALTER "sid" SET STORAGE PLAIN, + ALTER "sess" TYPE JSONB, + ALTER "expire" TYPE TIMESTAMPTZ, + CLUSTER ON "session_expire_idx"; + +CLUSTER "session"; +ANALYZE "session"; + +COMMIT;`, function (err) { + callback(err); + }); + }, +};