У меня есть две массивные таблицы с примерно 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. Однако запрос выполнялся в течение пяти дней, и он не заканчивался , поэтому я попытался запустить помощник по настройке базы данных, чтобы заставить его работать. Он предложил удалить мои старые индексы и вместо этого создать статистику и два кластеризованных индекса (по одному на каждую таблицу, просто содержащий TypeId, который я нахожу довольно странным - или просто тупым - но я все равно попробовал).
Он работает уже 6 дней, и я до сих пор не знаю, что делать ...
Есть идеи, ребята? Как я могу сделать это быстрее (или, по крайней мере, конечно)?
Обновление:
- Хорошо, я отменил запрос и перезагрузил сервер, чтобы снова запустить и запустить ОС
- Я перезапускаю рабочий процесс с вашими предлагаемыми изменениями, в частности, обрезая поле nvarchar до гораздо меньшего размера и заменяя «как» на «=». Это займет не менее двух часов, поэтому я буду публиковать дальнейшие обновления позже
Обновление 2 (13:00 по Гринвичу, 18.11.09):
- Предполагаемый план выполнения показывает 67% затрат на сканирование таблиц с последующим совпадением хэшей на 33%. Далее идет параллелизм 0% (не странно ли это? Это первый раз, когда я использую примерный план выполнения, но этот конкретный факт просто поднял мою бровь), 0% совпадения хэша, больше параллелизма 0%, 0% вершины, 0 % table insert и, наконец, еще 0% выберите. Кажется, что индексы, как и ожидалось, дерьмовые, поэтому я буду делать ручные индексы и откажусь от дерьмовых предложенных.