|
"Нормализация" данных
|
|||
---|---|---|---|
#18+
Есть таблица T1:(Код,Регион,Клиент,Продукт) все кроме Кода текст. Есть процесс "нормализации" преобразование и копирование данных в таблицу T2 (Код, RegionID, ClientID, ProductID) с паралельным заполнением справочников по Регионам, Клиентам и Продуктам. {xxxID - целочисленные типы} в настоящий момент используется курсор по таблице T1, который на каждом шаге по таблицам справочника возвращает из текстового представления - ID (если нет такого значения, добавляет) чтобы уменьшить кол-во поисков по справочникам исходный массив данных отсортирован, и на каждом последующем шаге текстовое значение сравнивается со значением на пред шаге, и если они совпадают, то поиск по справочнику не происходит, а берется уже известное ID. но все равно это работает медлено, подскажите как можно оптимизировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2003, 17:09 |
|
"Нормализация" данных
|
|||
---|---|---|---|
#18+
Вытащить все неповторяющиеся названия Регион,Клиент,Продукт по очереди и вставить их в соответствующие таблицы. Потом апдэйтим таблицу через связку названия тут и в соответствующей справочной таблице, беря ID из справочника и внося в основную. И так для всех. Это будет очень быстро. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2003, 19:01 |
|
"Нормализация" данных
|
|||
---|---|---|---|
#18+
Таблицу Т1 делаешь как представление (VIEW). Вешаешь на него триггер, который при заполнении этого представления элементарго вставляет значения в справочники (с предварительной проверкой на имеющиеся записи) или берет значения из этих справочников. Примерно так^ --------------- function GetRegion(in_RegName) return integer ValID integer begin select RegID into ValID from Region_Table where Upper(Region_Name)=Upper(in_RegName); return ValID exception when No_Data_Found then insert into Region_Table values (seq_reg_id.nextval,in_RegName); commit; return seq_reg_id.curval; when Others then return 0; end; --------------- ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2003, 19:09 |
|
"Нормализация" данных
|
|||
---|---|---|---|
#18+
Как бы сделал я. Естественно, что по полям Регион,Клиент и Продукт завёл бы вторичные индексы. Далее сформировал все справочники, выполнив запрос типа: insert ТРегион (РегионИмя) select distinct Регион from T1 insert ТКлиент (КлиентИмя) select distinct Клиент from T1 insert ТПродукт (ПродуктИмя) select distinct Продукт from T1 при этом поля RegionID, ClientID и ProductID в справочниках должны быть либо автоинкрементные (самогененрирующиеся), либо их необходимо будет потом сформировать. А когда справочники готовы, то можно и таблицу T2 формировать. Причём тут, возможно, тоже проще делать не замену влоб, когда "курсор по таблице T1", а сначала внести в T2 все значения КОД, а потом получать список всех кодов с одни и тем же регионом и у них устанавливать RegionID. При этом, естетсвенно, я двигаюсь по справочнику регионов, а не по T1. Получается запрос типа update T2 set RegionID=[число] where КОД in select КОД from T1 where Регион=[строка] значения [число] и [строка] берём из српавочника регоинов и повторяем запрос в цикле прохода по справочнику Регионов. С остальными полями аналогично. Ускорение будет хотя бы за счёт того, что уменьшится количесвто обращений к серверу и количество записей в журнале. Да и на многих серверах сократится количество транзакций (и соответсвенно, накладных раходов на открытие/закрытие транзакции), осоебнно если вы в явном виде не указываете начало/конец транзакции, а пользуетесь встроенными по умолчанию в среду разработки механизмами. Кстати, а в чём данные хранятся? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.09.2003, 22:43 |
|
"Нормализация" данных
|
|||
---|---|---|---|
#18+
MS SQL 7.0 если быть точным таблицы: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
... |
|||
:
Нравится:
Не нравится:
|
|||
09.09.2003, 00:16 |
|
|
start [/forum/topic.php?fid=32&msg=32259228&tid=1546845]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
144ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 239ms |
total: | 486ms |
0 / 0 |