Вы добавляете tbl_b для добавления статуса после номер заказа: create clustered index ... on tbl_b(orderNumber, status)
. Для запроса выше не будет заметной разницы. Плану все равно придется сканировать tbl_b от начала до конца и сопоставлять каждый номер заказа в tbl_a (возможно, объединение слиянием).
Вы расширяете tbl_b, чтобы добавить статус до номера заказа: create clustered index ... on tbl_b (status, orderNumber)
. Теперь есть огромная разница. План может выполнить сканирование диапазона для tbl_b, чтобы получить только те, которые имеют статус «xx», и сопоставить tbl_a только с соответствующим порядковым номером, используя соединение с вложенным циклом.
Размещение столбца с низкой избирательностью (например, «статус») в качестве крайнего левого ключа в индексе, как правило, хорошо. И создание строки, подобной 'status', в крайнем левом столбце кластерного индекса также обычно является хорошей идеей, поскольку физически группирует записи с одинаковым статусом. Обратите внимание, что это повлияет на все запросы. Вы также потеряете прямой доступ по orderNumber, если статус не указан, вам придется добавить некластеризованный индекс только для orderNumber, чтобы покрыть это (обычно это некластерный индекс PK).
Я сделал все эти комментарии без знания вашей фактической мощности и избирательности. Если количество элементов tbl_a и tbl_b сильно искажено, то все может быть иначе. Например. если tbl_a имеет 10 записей с 10 различными номерами заказов, а tbl_b имеет 10M записей с 10M номерами заказов, то мой вариант 2 не будет иметь большого значения, поскольку план всегда будет выбирать сканирование tbl_a при поиске диапазона поиска в tbl_b 10 раз.