Предположим, мне нужно обновить myTab из luTab следующим образом
update myTab
set LookupVale = (select LookupValue from luTab B
where B.idLookup = myTab.idLookup)
luTab состоит из 2 столбцов (idLookup (уникальный), LookupValue)
Что предпочтительнее: уникальный кластеризованный индекс для idLookup или индекс для idLookup и Lookupvalue вместе взятые? Будет ли какой-либо индекс покрытия в этой ситуации иметь значение?
(меня больше всего интересует SQL-сервер)
Эпилог:
Я выполнил следующие тесты Krips с 27M строками в myTab, 1,5M строками в luTab.
Важнейшая часть, кажется, уникальность индекса.
Если индекс указан как уникальный, обновление использует хеш-таблицу.
Если он не указан как уникальный, то обновление сначала агрегирует luTab с помощью idLookup (Stream Aggegate), а затем использует вложенный цикл. Это намного медленнее.
Когда я использую расширенный индекс, в SQL больше не предполагается, что это LookupValue является уникальным, поэтому он вынужден идти по гораздо более медленному маршруту цикла с вложенным циклом