The code looks fine. This is also the recommended approach for the case the target page needs to be opened by an idempotent request. See further also How to navigate in JSF? How to make URL reflect current page (and not previous one) for some general hints.
Your real problem is apparently just the DB performance (although a single select on a properly indexed table should be relatively cheap, sure that it isn't just the connection cost (use connection pool) or the network latency (host DB server near to web server)). Introducing kind of 2nd level cache in persistence layer may help a lot. Refer the documentation of persistence layer in question using the keywords "second level cache" or "L2 cache".
Note that this is beyond the scope of JSF. Abusing the JSF session scope is another way, but not the right one. Sharing data between two view scoped bean instances separated by a GET request is not possible as their lifecycle ends and starts with a GET request. See also JSF ViewScoped variable not surviving redirect to same page.