Без практического доступа сложно найти сложные и быстрые решения.Некоторые идеи и предложения:
Без объединения таблицы B все, что нужно сделать SQL (с индексом A.Number), - это пройти до тех пор, пока не найдет первые 50 строк, соответствующих вашему шаблону.Если значения «Number» относительно уникальны (не так много дубликатов (это количество элементов)), то иметь значение Creation_Date в индексе также мало смысла.
Почему левое внешнее соединение с B?Это от одного до [нуля или одного] или от одного до [нуля или многих]?Если количество элементов низкое (много дубликатов в A), то объединение требуется, чтобы четко найти «первые 50», иначе можно было бы подумать, что объединение не повлияет на производительность, кроме необходимости выполнить объединение).Я не вижу никакого индекса на B (кроме идентификатора столбца), который имеет значение здесь.Хм, у вас есть индекс на B.Id, верно?Если нет, то это может сильно замедлить ход событий (конечно, при условии, что B имеет значительное количество строк).
Для получения более подробных сведений я хотел бы рассмотреть количество элементов объединения и порядка по столбцам,и очень внимательно изучите план выполнения запроса «с соединением».
Дополнения
Если A имеет низкое количество элементов (много дубликатов), то оптимизатор запросов может «подумать»что для решения порядка потребуется много B.Id (что необходимо сделать, чтобы найти Top 50).Это может объяснить, почему он делает то, что делает.
Если они будут давать 100% эквивалентные результаты, я бы рекомендовал заменить ЛЕВОЕ соединение на ВНУТРЕННЕЕ.В целом, планы запросов могут стать намного проще, если действуют более строгие условия объединения.