У меня есть две огромные таблицы, каждая из которых содержит около 100 миллионов записей, и я боюсь, что мне нужно выполнить внутреннюю связь между ними. Теперь обе таблицы очень просты; здесь описание:
Таблица BioEntity:
- BioEntityId (int)
- Название (nvarchar 4000, хотя это перебор)
- TypeId (int)
Таблица EGM (фактическая таблица, в результате которой выполняются операции массового импорта):
- EMGId (int)
- PId (int)
- Название (nvarchar 4000, хотя это перебор)
- TypeId (int)
- LastModified (дата)
Мне нужно получить соответствующее имя, чтобы связать BioEntityId с PId, находящимся в таблице EGM. Первоначально я пытался сделать все с помощью одного внутреннего соединения, но запрос, казалось, слишком длился, и файл журнала базы данных (в простом режиме восстановления) смог пережевать все доступное дисковое пространство (это чуть более 200 ГБ, когда база данных занимает 18 ГБ), и запрос будет терпеть неудачу после ожидания в течение двух дней. Если я не ошибаюсь. Мне удалось удержать журнал от роста (теперь только 33 МБ), но этот запрос работает без остановок в течение 6 дней, и это не похоже, что он скоро остановится.
Я запускаю его на довольно приличном компьютере (4 ГБ оперативной памяти, Core 2 Duo (E8400) 3GHz, Windows Server 2008, SQL Server 2008), и я заметил, что компьютер периодически застревает каждые 30 секунд (дайте или возьмите ) на пару секунд. Это делает его довольно трудно использовать для чего-либо еще, что действительно нервничает.
Теперь вот запрос:
SELECT EGM.Name, BioEntity.BioEntityId INTO AUX
FROM EGM INNER JOIN BioEntity
ON EGM.name LIKE BioEntity.Name AND EGM.TypeId = BioEntity.TypeId
Я вручную настроил некоторые индексы; как EGM, так и BioEntity имели некластеризованный индекс покрытия, содержащий TypeId и Name. Однако запрос выполнялся в течение пяти дней, и он не заканчивался, поэтому я попробовал запустить Database Tuning Advisor, чтобы заставить эту работу работать. Он предложил удалить старые индексы и создать статистику и два кластеризованных индекса (по одной на каждую таблицу, просто содержащую TypeId, которую я нахожу довольно нечетным - или просто тупой, но я все равно дал ему).
Он работает уже 6 дней, и я все еще не уверен, что делать... Любые идеи парней? Как я могу сделать это быстрее (или, по крайней мере, конечным)?
Update: - Хорошо, я отменил запрос и перезагрузил сервер, чтобы снова запустить и запустить ОС. - Я обновляю рабочий процесс с вашими предлагаемыми изменениями, в частности, обрезая поле nvarchar на гораздо меньший размер и меняя "как" на "=". Это займет не менее двух часов, поэтому я буду публиковать дальнейшие обновления позже
Обновление 2 (1PM GMT, 18/11/09): - Предполагаемый план выполнения показывает 67% затрат на сканирование таблиц, за которым следует 33-процентное хеш-совпадение. Далее приходит 0% parallelism (это не странно? Это первый раз, когда я использую оценочный план выполнения, но этот конкретный факт только поднял бровь), 0% хеш-матч, больше 0% parallelism, 0 % top, 0% вставка таблицы и, наконец, еще один 0% выбор. Кажется, индексы - это дерьмо, как и ожидалось, поэтому я буду делать ручные индексы и отказываться от дрянных предложенных.