|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
День добрый! Стоит простая задачка сделать обновление справочника. Есть основная база на SQL и есть присылаемый из вне справочник DBF количество записей порядка 250 000. Т.е. сходу приходит только один вариант решения: Выборка всех записей из dbf , Циклический перебор отобранных записей с поиском в SQL. если такая же найдена, то Update если нет то addnew. Единственное что приходит в голову сделать для ускорения это использовать курсор adOpenForwardOnly, adLockReadOnly при чтении dbf. Может есть еще какие способы? например я знаю в 4GL есть возможность проверять без физического перемещения по запися. Есть ли аналог в SQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:23 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Alex_men, Таблицы SQL индексированы ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:24 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
1) а чем не устраивает SELECT ... WHERE ....? Зачем нужен перебор? 2) если на нужное поле есть уникальный индекс, можно просто попытаться добавить запись. Есил возникнет ошибка и запись не добавится, значит она уже есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:31 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
bulk заюзать для загрузки всего из dbf в sql. далее запросом update+insert ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:32 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
так, может я недостаточно внимательно прочитал Alex_menЕсть основная база на SQLэто что значит? Какая СУБД конкретно? Если MSSQL - там есть классная штуковина - Linked Server. Таблица чужеродной базы станет как бы локальной. Кстати и причем тогда тут VB? Это надо делать процедурами на сервере. ЗЫ: ну и мой вариант №2 это не отменяет ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:34 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Konst_Onebulk заюзать для загрузки всего из dbf в sqlну или так ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:34 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Konst_One +100 Shocker.ProЕсил возникнет ошибка и запись не добавится, значит она уже есть.Обработка исключений еще медленнее перебора. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:36 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Shocker.Pro1) а чем не устраивает SELECT ... WHERE ....? Зачем нужен перебор? 2) если на нужное поле есть уникальный индекс, можно просто попытаться добавить запись. Есил возникнет ошибка и запись не добавится, значит она уже есть. а SELECT...WHERE разве не подразумевает перебор? получается я встал на запись в DBF делаю SELECT в SQL и далее по обстоятельствам INSERT или UPDATE. Потом переход к следующей записи. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:43 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Konst_One, интересно тут надо почитать. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:43 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
мыслите кортежами(наборами) данных, а не отдельными строками в таблице ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:46 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Shocker.Proтак, может я недостаточно внимательно прочитал это что значит? Какая СУБД конкретно? Если MSSQL - там есть классная штуковина - Linked Server. Таблица чужеродной базы станет как бы локальной. да MSSQL. Как Линкед сервер влияет на быстродействие? Далее база многопользовательская, получается при замене файла мне надо проверять не сидит ли кто в таблице и не выполняется ли с ней какие авто процедуры я так понимаю? потом мне это дело надо еще дальше рассылать и лично я хотел только то что изменилось. А в этом случае мне придется кидать полную DBF что а великовато по размерам и требует ручного размещения на стороне удаленных клиентов с офлайн базкой. Shocker.ProКстати и причем тогда тут VB? Это надо делать процедурами на сервере. ЗЫ: ну и мой вариант №2 это не отменяет ну я не настолько хорошо знаком с этими процедурами, а не подразумевает ли это размещение исходной dbf на сервере? Имеются ввиду хранимки? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 17:53 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Konst_One, гм кортеж вроде как для многомерных наборов данных, а тут плоская таблица, никаких кубиков. Пойду себе книжицу по программированию SQL подищу. Есть на эту тему какие нибудь рекомендации по авторам изданиям? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 18:14 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Обновлять надо только одну таблицу в БД MSSQL? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 21:57 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Alex_menа SELECT...WHERE разве не подразумевает перебор?не подразумевает, потому что будет сканирование дерева индекса а это на порядки быстрее, не говоря уж о том, что это будет делать сервер, не передавая никуда данные. Alex_menа MSSQL. Как Линкед сервер влияет на быстродействие?Тем, что он зальет к себе эту таблицу, дальше единственным INSERT-ом с JOIN-ом можно вставить несовпадающие записи. Самое главное в этом всем - уйти от перебора на клиенте - это самое худшее, что можно придумать Alex_menДалее база многопользовательская, получается при замене файла мне надо проверять не сидит ли кто в таблице и не выполняется ли с ней какие авто процедуры я так понимаю?Сервер сам решит эту задачу посредством блокировки таблицы во время выполнения запроса. Alex_menпотом мне это дело надо еще дальше рассылать и лично я хотел только то что изменилось.Это решается дополнительным столбцом в таблицы с временем создания записи (ну или версией, номером обновления и т.п.) Alex_menА в этом случае мне придется кидать полную DBF что а великовато по размерам и требует ручного размещения на стороне удаленных клиентов с офлайн базкой.Зачем? Опять же потом выбросить результат в DBF. отобранный по вышеназванному полю Alex_menа не подразумевает ли это размещение исходной dbf на сервере?на сервере или на сетевом диске, ну да, доступ должен быть даден серверу Вообще, чтобы четче понимать задачу, обрисуй порядки цифр, сколько записей в исходной таблице, сколько записей в DBF-ке и сколько записей добавляется за одно обновление. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.02.2012, 23:34 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
AndreTM, Да только одну. Что то я в книгах по программированию SQL нигде описания bulk и как его правильно использовать не нахожу. Там максимум INSERT SELECT нашел. Да и запрос update+insert что то я не нашел ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2012, 17:55 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Alex_menЧто то я в книгах по программированию SQL нигде описания bulk и как его правильно использовать не нахожу.И не найдешь. Это надо искать в книгах на конкретный сервер, множественная заливка данных есть не везде а там где есть реализована по разному. Если у тебя MS SQL, то читай главу посвященную bcp.exe. Alex_men Там максимум INSERT SELECT нашел. Да и запрос update+insert что то я не нашелТоже есть не везде. В MS SQL нет вообще. На MSSQL это делается тремя отдельными командами: select чтобы проверить есть ли строка с нужным первичным ключом, потом insert если такой строки нет и update если она уже есть. Либо двумя: безусловный delete строки с первичным ключом, потом insert. Это конечно не будет работать в случае с внешними ключами. Сразу предупрежу: bulk insert работает именно по этому принципу. Вернее bulk insert просто вставляет, удалять старое ты должен будешь сам. Еще там есть особенности по триггерам и логу... Alex_menВыборка всех записей из dbf , Циклический перебор отобранных записей с поиском в SQL. если такая же найдена, то Update если нет то addnew.Это самое надежное решение. Впрочем, можно еще попробовать делать bcp in во вспомогательную таблицу, потом insert из вспомогательной в главную тех первичных ключей который отсутствуют, потом update главной таблицы на основе вспомогательной, и последний шаг - полная очистка вспомогательной. Это будет чуть сложнее с SQL точки зрения, но намного быстрее чем цикл на клиенте. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2012, 21:43 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
White OwlНа MSSQL это делается тремя отдельными командами: select чтобы проверить есть ли строка с нужным первичным ключом, потом insert если такой строки нет и update если она уже есть.можно обойтись без SELECT если строка одна - пытаться сделать UPDATE и смотреть @@rowcount, если 0 - делать INSERT если строк несколько - лучше запихать их в отдельную таблицу, а затем два пакетных запроса - INSERT и UPDATE, приджойнив таблицы между собой. ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2012, 22:08 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
White Owlпотом insert из вспомогательной в главную тех первичных ключей который отсутствуют, потом update главной таблицы на основе вспомогательнойПочему сразу не вставить и ключи и прочие данные? ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2012, 22:50 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Ну да. Суть в чём: таблицу в самой БД нам жалко, - она в это время может быть заюзана; опять же, сервер на ходу и нагружен... С другой стороны, присланная DBF-ка (ну, копия её) нам по-барабану - мы её можем иметь, как хотим. Вот её грузим в отдельную таблицу - и над этой таблицей работаем - удаляем из нее дубли, а остальные записи помечаем для UPDATE/INSERT. А затем двумя движениями вливаем в наш справочник... ... |
|||
:
Нравится:
Не нравится:
|
|||
13.02.2012, 23:13 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Так все таки, правильно я понял что одним запросом я не могу сделать так: найти запросом все совпадающие записи (в SQL табличке с DBF) и проапдейтить этот набор записей одним запросом? всетаки нужно построчно? ну и соответственно потом просто все остальные записи добавить ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2012, 10:11 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Alex_menТак все таки, правильно я понял что одним запросом я не могу сделать так:двумя запросамиAlex_menвсетаки нужно построчно?нет, это одним запросом (для всех записей сразу) Alex_menну и соответственно потом просто все остальные записи добавитьэто вторым запросом ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2012, 10:44 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Shocker.Pro, Вот теперь определился пошел работать ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2012, 11:29 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Shocker.Pro, Хотел уточнить (просто раньше никогда не делал UPDATE целыми таблицами) правильно ли я понимаю: Код: vbnet 1. 2. 3.
а INSERT Соответственно Код: vbnet 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2012, 11:46 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
Таблицу t2 тоже надо объявить в запросе что-то типа Код: sql 1. 2. 3.
или Код: sql 1. 2. 3. 4.
я предпочитаю первую запись, она понятнее ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2012, 12:06 |
|
Есть ли способы ускорить процесс обновления справочника?
|
|||
---|---|---|---|
#18+
В update одна ошибка: Код: sql 1. 2. 3. 4.
В insert две. values это набор конкретных значений для вставки одной записи. А условие t1.p0<>t2.p0 вставит все записи из t2 для каждой записи из t1 кроме той, значения p0 которых равны. То есть в результате вставится (count(t2.*) - 1) * count(t1.*) записей. Правильно это делается так: Код: sql 1. 2. 3.
Если записей в t1 много, лучше перед этим очистить t2 от уже обработанных записей: Код: sql 1.
Очистка от записей, которые были обновлены ... |
|||
:
Нравится:
Не нравится:
|
|||
14.02.2012, 12:12 |
|
|
start [/forum/topic.php?fid=60&msg=37656392&tid=2157583]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
39ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
others: | 296ms |
total: | 437ms |
0 / 0 |