ник: osmor
Задача есть 2 таблицы tblAliases и ostmp_tblAlias почти одинаковой структуры и к ним кадой по справочнику соответвенно tblAlias_Org и ostmp_tblAliasOrg (чтобы снять вопросы о нормализации, поясню, одна таблица это фактически прилинкованный тектовый файл из которого данные, после обработки, попадут во вторую таблицу).
суть таблиц такова
Есть 2 набора алиасов (2 таблицы) существующие и новые, каждому алиасу соответствует один или несколько огранизмов (одна или несколько строк в таблице tblAlias_Org или ostmp_tblAliasOrg)
так вот структура этих таблиц
AliasID - уникальный ключ
ValTok - тектовое поле длинной 255 символов
CaseMaskVal - тектовое поле состоящее из 0 и 1 описывающее положение больших и маленьких букв в поле ValTok, например
ValTok = M2M, CaseMaskVal = 101
ValTok = M2m, CaseMaskVal = 100
ValTok = m2M, CaseMaskVal = 0
в общем это поле нужно для сравнения ValTok с учетом регистра.
все остальные поля не интересны
Далее справочник tblAlias_Org (ну или ostmp_tblAliasOrg для новых алиасов)
AliasID - код алиаса длинное целое
OrgID - код организма Длинное целое (есть еще таблица tblOrg которая содержит все возможные организмы)
Особенность!!!! Если у алиаса установлено orgID = 1 это значит у этого алиаса есть ВСЕ ДОСТУПНЫЕ ОРГАНИЗМЫ.
Задача найти в этих двух таблицах (tblAliases и ostmp_tblAlias) записи совпадающие по
ValTok
CaseMaskVaL
OrgID из соответсвующего справочника
Нужно учесть что если OrgID = 1, то эта запись будет совпадать со всеми записями у которых такие же ValTok + CaseMaskVaL даже если OrgID какой-то другой.
Спасибо всем кто дочитал досюда....
Ка сделано сейчас.
Для разрешения проблемы с OrgID создан запрос который для OrgID = 1 создает все созможные OrgId, т.е. для записи OrgId = 1 "создает" много записей (столько сколько вообще есть этих OrgID)
назвается qAllOrg
Создан запрос который содержит записи из tblAliases со всеми возможными кодами организмов назвается qExistAliasWAllOrg
Создан запрос который содержит записи из stmp_tblAlias со всеми возможными кодами организмов назвается qNewAliasWAllOrg
Ну и результирующий запрос который выводит в отдельную таблицу AliasID для записей у которых совпадает
ValTok
CaseMaskVaL
OrgID
называется этот запрос qAddIdAliasWNotUniqVal
Все это добро можно увидеть в аттаче.
Теперь собственно вопрос:
реально размеры таблиц такие
tblAliases - 600'000 записей (это существующие алиасы, каждой соответствует от 1 до 5 записей в таблице tblAlias_Org, но для id = 1 они размножаются до 12)
ostmp_tblAlias - от 100 до 100'000 записей (это новые алиасы каждой соответствует от 1 до 5 записей в таблице ostmp_tblAliasOrg но для id = 1 они размножаются до 12)
Все работает если записей в новой таблице 200, медленно но работает, а на 100'000 запрос работал 2-е суток, и не отработал.
Задача, снизить время хотя бы да нескольких часов.
Первое что приходит на ум этозаменить запросы на выборку qExistAliasWAllOrg и qNewAliasWAllOrg запросами на добавление во временные таблицы и уже эти таблицы использовать в результирующем запросе qAddIdAliasWNotUniqVal, но может есть другие идеи? Может запросы как переписать?
Файл в формате 2000 прилагается, таблицы почистил, так что бы весил поменьше.
Понимаю что "очень многа букав", и вникать э это добро довольно сложно, так что всем кто хотя бы прочитал - огромное спасибо!