Without only an anonymized plan, it is difficult to help with specifics.
The optimizer has pointed out there is a potential missing index on Object2 (right click on the SELECT in the plan and choose the Missing Index Details... option).
Object5.Index5 is being read twice, with the same row count for both on the read, then the same sort is being done. I recommend investigating methods to only do the work on Object5 one time. This may include using a temp table and/or rewriting the query and joins.
There is also a Table Valued Function being used on Object8, I would investigate removing the use of the TVF. It is the highest CPU cost in your plan.
Providing more details of the query and options you have tried can provide a better view and allow us to provide more detailed help.
By SDyckes2 96 answered Nov 08, 2017 at 03:12 PM
I replaced the table valued functions with CTEs. The function just returns a table from a comma delimited string (params). This is SQL 2012. My query went from 11 seconds to 8 seconds. I'm not sure putting the function in CTEs made it only called once instead of twice.
By jrb2971 1 answered Nov 08, 2017 at 05:48 PM