I am not sure but do you pass different parameters every time user calls it. if yes, One way would be to get all the data if possible into a physical table by executing it. Do not apply any restrictions at this point. Then users can query it and can apply the restrictions. You will need to populate the table if data is being changed. If data changes are frequent, then do noyt even try this solution.
Thanks