In this scenario, you only have this one query that apparently does better in SQL Server 2014 than 2017. That’s all “New CE” there’s no CE70 vs CE 120+ at issue here. Using any known trace flag, the FORCE_ LEGACY _CARDINALITY_ESTIMATION hint or the FORCE_ DEFAULT _CARDINALITY_ESTIMATION hint doesn’t help. Rewriting the query is an option, but in the interim, I need a quick fix. How?
In SQL Server 2017 CU10 , we have introduced a few new USE HINTs: the QUERY_OPTIMIZER_COMPATIBILITY_LEVEL_ n , where n is a supported database compatibility level. This forces the query optimizer behavior at a query level, as if the query was compiled with database compatibility level. You can refer to sys.dm_exec_valid_use_hints for a list of currently supported values for n .
So to be clear, the new hint is not forcing only a specific CE model, it’s forcing the equivalent of the specific database compatibility level’s query optimizer behavior, including any query optimizer fixes that are enabled by default in that database compatibility level.