diff --git a/src/lua/session.cc b/src/lua/session.cc
index 45a97ba6b7474d13dffff85eedea8a75d44dd9f4..05a21ce4baa85314de40c59b3cafe0b3ca6c79c8 100644
--- a/src/lua/session.cc
+++ b/src/lua/session.cc
@@ -179,21 +179,21 @@ lbox_session_on_disconnect(struct lua_State *L)
 void
 session_storage_cleanup(int sid)
 {
-	int top = lua_gettop(root_L);
-	lua_pushliteral(root_L, "box");
-	lua_rawget(root_L, LUA_GLOBALSINDEX);
-
-	lua_pushliteral(root_L, "session");
-	lua_rawget(root_L, -2);
+	static int ref = LUA_REFNIL;
 
-	lua_getmetatable(root_L, -1);
+	int top = lua_gettop(root_L);
 
-	lua_pushliteral(root_L, "aggregate_storage");
-	lua_rawget(root_L, -2);
+	if (ref == LUA_REFNIL) {
+		lua_getfield(root_L, LUA_GLOBALSINDEX, "box");
+		lua_getfield(root_L, -1, "session");
+		lua_getmetatable(root_L, -1);
+		lua_getfield(root_L, -1, "aggregate_storage");
+		ref = luaL_ref(root_L, LUA_REGISTRYINDEX);
+	}
+	lua_rawgeti(root_L, LUA_REGISTRYINDEX, ref);
 
 	lua_pushnil(root_L);
 	lua_rawseti(root_L, -2, sid);
-
 	lua_settop(root_L, top);
 }