What practices will help me write an efficient query against a large partitioned table?
Partitions do not really matter if you have proper indices. So, the practice is to learn your tools.

Partitions are not more effective than an index - they are there for managing data, i.e. fast delete (swapp out a partition in a millisecond instead of spending hours deleting 12 billion rows in it).

So, the question is: How do I make this query faster - without partition.

Start by deleting the distinct. Go on by actually givine a query plan and - with 2200 clients, please tell us about the server cluster you use to handle the load.