One way is to put subqueries to pull the required fields data from the table in hte FROM clause instead of joining the entire table. You have 23 tables being joined and there might be some tabls where you are pulling only few fields out of say 100 columns present. Put a subquery to these kind of data pull. It will surely improve performance of the query.
It would be more better if you split the BIG query into few smaller ones. Instead of performing in one SQL query, try achieving it in splitting the query into 2 or 3 SQL's.