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