|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33Дело в том что 500 000 записей по одной команде загонять в MySQL - длится сутки даже по localhost. Полный абзац! Меняйте "консерваторию"! Или там живёт ЧТО-ТО, о чём Вы не знаете! 2.5 млн. инсертов (просто инсерт и ничего больше) - 9-10 минут... не localhost, конечно! ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 08:51 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33Поверьте это так. 500 000 записей, по одной записи обновляются в цикле командой MySQL UPDATE по уникальному ключу. Процесс длится сутки. Есть подозрение что ключ условно ключем называется, а реально просто поле и индекса по нему нет. Проверь что есть индекс по этому полю. UPDATE это не вставка, а обновление данных. Гораздо быстрее выполнится один UPDATE полмиллиона записей, чем полмиллиона по одному. Поэтому лучше сначала создать временную таблицу на сервере, вставить туда данные, а потом UPDATE делать из нее. Чтобы сократить время на передачу данных серверу можно передавать по несколько команд серверу за одно обращение, как выше Владимир писал: Код: plaintext 1. 2. 3.
За раз полмиллиона инсертов не уйдет, т.к. у SQLExec есть ограничение на размер передаваемых данных. Питон33SQLPREPARE() просто подготавливает для выполнения, а выполнение будет в самом конце по команде SQLEXEC(). Сомневаюсь что это поможет. Как я понимаю SQLPREPARE() подготавливает только план выполнения запроса. Способы быстрой вставки зависят от типа SQL-сервера, поэтому лучше в форуме по MySQL-ю спросить. PS Фокс заточен под MSSQL, с остальными SQL-серверами часто бывают проблемы на ровном месте из-за неполной совместимости с ODBC драйвером, поэтому советую попробовать несколько разных драйверов. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 09:29 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33tanglir, Пример можно? load data нету такой команды в фоксе.Разумеется нет. Это же не в фокс надо грузить. Это на сервере надо смотреть. Вам уже намекали про участие обоих сторон в процессе. Не в одном фоксе дело, надо чтоб и сервер умел "одной командой" грузить большое количество данных. Load data как раз серверная команда из этой серии. На MySQL она есть? Или что-то подобное? Наверняка что-то должно быть. Ну так и надо сначала узнать необходимые для использования этой возможности условия и посмотреть возможность выполнения этих условий с помощью фокса. Все остальные варианты являются маскировкой многочисленных insert. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 10:01 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
с курсорадаптером сами пример найдете? или рисовать? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 10:14 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
RedrikПитон33Дело в том что 500 000 записей по одной команде загонять в MySQL - длится сутки даже по localhost. Полный абзац! Меняйте "консерваторию"! Или там живёт ЧТО-ТО, о чём Вы не знаете! 2.5 млн. инсертов (просто инсерт и ничего больше) - 9-10 минут... не localhost, конечно! UPDATE работает дольше чем INSERT так как она ещё и ищет запись по ключу прежде чем обновить. Согласен что можно ускорить процесс, так как там интерфейсная часть ещё и всякие рефреши в окне, да и комп слабоват. Но всё равно я думаю через SQLPREPARE() будет пошустрее если их пачкой сперва выдать и в конце SQLEXEC(). ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 10:28 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
прошелмимос курсорадаптером сами пример найдете? или рисовать? Нарисуй, только условие я написал - на сервере Ни каких программ устанавливать не будут - это исключено. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 10:32 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33tanglir, Пример можно?вот кусок примера: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 11:35 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33ВладимирМ"Не верю" (с) Не может такое относительно небольшое количество записей столько времени обрабатываться. Что-то Вы не договариваете. Какие-то у Вас идут дополнительные обработки не связанные с закачкой данных на сервер. Поверьте это так. 500 000 записей, по одной записи обновляются в цикле командой MySQL UPDATE по уникальному ключу. Процесс длится сутки. Мы так будем еще месяца два обсуждать. То Вы заявляете, что Вам надо всего-лишь закачать таблицу DBF в базу MySQL, то теперь вдруг выясняется, что Вы выполняете какую-то модификацию. Поскольку Вы не можете внятно объяснить, что же именно Вы делаете, я и предлагаю Вам привести код выполняемых операций. Тогда и советы по оптимизации будут более предметными. Питон33ВладимирМДа какой там план выполнения у команды вставки одной записи! Откуда возьмется ускорение-то? Впрочем, может это какая фича именно MySQL? Ускорение будет, так как выполняются все команды сразу, а не по отдельности SQLEXEC() Каждый раз SQLEXEC() ожидает ответа от сервера, иными словами 500 000 раз тормозит. SQLPREPARE() просто подготавливает для выполнения, а выполнение будет в самом конце по команде SQLEXEC(). Похоже, Вы не понимаете, что именно делает сервер и для чего нужна команда SQLPrepare(). Любой сервер (любая СУБД) прежде, чем выполнить какую-либо команду предварительно строит план ее выполнения для того, чтобы выбрать наиболее оптимальный (наиболее быстрый) способ ее выполнения. Таким образом, выполнение команды разбивается на 2 этапа - Формирование плана выполнения команды - Собственно выполнение по сформированному плану Так вот, команда SQLExec() выполняет обе эти операции. А SQLPrepare() - это предварительное построение плана выполнения запроса без собственно выполнения. А последующая SQLExec() - причем определенного вида - просто использует этот план. Когда будет выгодно использование SQLPrepare()? Очевидно, при выполнении множества однотипных запросов (множество SQLExec() в цикле), для которых один и тот же план выполнения будет наиболее оптимальным. При этом, разумеется, для конкретного SQL-сервера должна иметься принципиальная возможность разделить операцию построения плана и собственно выполнение команды Теперь, что именно Вы заявили с самого начала (что именно Вы делаете). Питон33КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ??? Любой человек работающий с базами данных однозначно интерпретирует подобную постановку задачи как Insert-SQL. Т.е. вставка новых записей. Не думаю, чтобы план построения команды на вставку записи отличался какой-либо сложностью и занимал много времени. Как следствие, SQLPrepare() в принципе не должен дать никакого заметного ускорения. Однако далее вдруг возникает упоминание о каких-то UPDATE, что совершенно не вяжется с заявленной в начале темы постановки задачи. Вам надо не "передать таблицу", а обновить информацию в талице MySQL данными из таблицы DBF. А это уже принципиально другая постановка задачи. Подобная задача в принципе не решается "одной командой". Никак. Никоим образом. Тут, как минимум, 3 этапа - Обновить записи, которые есть и в MySQL, и в DBF - Удалить записи, которые есть в MySQL, но нет в DBF - Создать записи, которых нет в MySQL, но есть в DBF Разумеется, чтобы выполнить сравнение таблицы MySQL и DBF их сначала необходимо "перелить" в общее хранилище. Либо DBF в некую временную таблицу MySQL, либо таблицу MySQL в таблицу DBF, либо их обоих в какое-то третье хранилище. А потом уже выполнять сравнение. Так ЧТО Вы хотите сделать? Не надо словами. У Вас не очень-то получается. Приведите код. Не обязательно командами. Можно просто описание этапов действий, примерно так: - Организуем цикл перебора записей в DBF - Для каждой записи DBF ищем запись в MySQL - Если нашли, то обновляем информацию - Если не нашли, то создаем новую запись в MySQL - (...) Вы ЭТО делаете или что-то другое? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 12:35 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
ВладимирМ.... Подобная задача в принципе не решается "одной командой". Никак. Никоим образом. Тут, как минимум, 3 этапа - Обновить записи, которые есть и в MySQL, и в DBF - Удалить записи, которые есть в MySQL, но нет в DBF - Создать записи, которых нет в MySQL, но есть в DBF В Microsoft SQL 2008 решается. Теперь есть команда MERGE: Выполняет операции вставки, обновления или удаления для целевой таблицы на основе результатов соединения с исходной таблицей. Например, можно синхронизировать две таблицы путем вставки, обновления или удаления строк в одной таблице на основании отличий, найденных в другой таблице. А если такая команда в MySQL не знаю! С уважением, Алексей ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 13:44 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
ВладимирМ, Вы просто переписали мои же слова. Если в цикле стоят команды UPDATE и выполняются 500 000 раз, тогда SQLPREPARE() совместно с SQLEXEC() будет работать быстрее чем просто SQLEXEC() Для этого подготавливаем группу команд для MySQL по средством SQLPREPARE() А в самом конце даём один раз SQLEXEC() Возникает вопрос: Сколько их всего таких команд можно и желательно посылать мускулу за один цикл через SQLPREPARE() ? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 14:56 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
> Автор: Питон33 > Возникает вопрос: Сколько их всего таких команд можно и желательно посылать мускулу за один цикл через > SQLPREPARE() ? Спроси об этом в ветке по MySql. И, я присоединяюсь к мнению многих что у тебя что-то в консерватории не правильно, если апдейт пятисот тысяч записей занимает восемь часов. Что именно не правильно отсюда не видно, это может быть: отсуствие индекса по полю фильтрации тригера, выполняющие сложные вычисления или каскады тригеров серверное железо не справляется с нагрузкой загружен канал передачи данных ... комбинация вышеперечисленных причин Препарированием запроса ты вряд-ли "кардинально" улучшишь производительность. Тебе лучше пообщатся со специалистами в MySql на предмет как лучше реализовать массовые обновления. Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 15:08 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
tanglir, Я понял вашу мысль это тоже интересный способ. Т.е. как я понял: Load Data infile - это команда mysql которая попросит mysql закачать файл с моего компа? Не будет ли при этом комп задавать лишних вопросов пугая юзеров? Идея интересная, но реализация сложновата. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 15:09 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Игорь Горбонос, Тут вопрос и к фокспрошникам и к мускулистам. По-скольку мне надо закачать DBF на сервак, а работать с форматом MySQL. При этом нужно выбрать быстрый и удобный способ. Повторяю - на серваке никто никаких программ и модулей дополнительно устанавливать не будет. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 15:16 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
> Автор: Питон33 > Тут вопрос и к фокспрошникам и к мускулистам. Да, только мускулисты тусуются здесь , а фокспрошники тебе уже выдали все возможные рекомендации. Осталась только специфика MySql :) Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 15:22 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33Вы просто переписали мои же слова. Если в цикле стоят команды UPDATE и выполняются 500 000 раз, тогда SQLPREPARE() совместно с SQLEXEC() будет работать быстрее чем просто SQLEXEC() Это предположение . Но далеко не факт, что именно так и будет. Питон33Для этого подготавливаем группу команд для MySQL по средством SQLPREPARE() А в самом конце даём один раз SQLEXEC() Не так. Вы опять ничего не поняли. Вот пример из справки FoxPro по команде SQLPrepare() Код: plaintext 1. 2. 3. 4. 5. 6.
Что требуется в Вашем случае - совершенно непонятно. Вы все время уходите в сторону не желая сознаться, что же Вы делаете. Вот я и прошу уже в который раз написать ЧТО Вы делаете? Питон33По-скольку мне надо закачать DBF на сервак, а работать с форматом MySQL. SQLPrepare() к этому вопросу вообще не имеет никакого отношения. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 15:28 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33работать с форматом MySQL.C форматом Вам поработать не удасться. Вы можете поработать с сервером, отправляя ему команды и получая результаты отработки этих команд. Формата MySQL, впрочем как и формата MS SQL нет. Есть форматы хранения, которые пользователю сервера нафиг не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 15:47 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
ВладимирМНаконец, вероятно, Вы этот момент не вполне поняли, но можно в одном пакете передавать несколько команд. Примерно так Код: plaintext 1. 2. 3. 4.
Надо только уточнить, каким символом разделяются команды в среде MySQL. Будет ли достаточно пробела (как в приведенном примере) или надо что-то еще ставить. Например, точку с запятой или перевод строки Проверил, не работает ни точка с запятой, ни пробел. SQLPREPARE() тоже не помогает. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 16:40 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33, в настройках соединения есть такая штука, как OPTION (числовое), один из параметров в нём называется "allow multiple statements". Поищите, значения параметров где-то даже тут были. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 17:01 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Питон33ВладимирМНаконец, вероятно, Вы этот момент не вполне поняли, но можно в одном пакете передавать несколько команд. Примерно так Код: plaintext 1. 2. 3. 4.
Надо только уточнить, каким символом разделяются команды в среде MySQL. Будет ли достаточно пробела (как в приведенном примере) или надо что-то еще ставить. Например, точку с запятой или перевод строки Проверил, не работает ни точка с запятой, ни пробел. Плохо проверяли, да и ленитесь сами искать. Неоднократно же "посылали" на форум по MySQL. Поиск по фразе "несколько команд" сразу выдал ссылку http://dev.mysql.com/doc/refman/5.0/en/c-api-multiple-queries.html Т.е. разделителем команд является точка с запятой, следовательно синтаксис должен быть такой Код: plaintext 1. 2. 3. 4.
Однако предварительно надо дать понять MySQL, что один запрос может содержать несколько команд. Для этого в строке соединения указать опцию CLIENT_MULTI_STATEMENTS или указать эту опцию отдельной настройкой после установки соединения MySQLMySQL 5.0 also supports the execution of a string containing multiple statements separated by semicolon (“;”) characters. This capability is enabled by special options that are specified either when you connect to the server with mysql_real_connect() or after connecting by calling` mysql_set_server_option(). Питон33SQLPREPARE() тоже не помогает. И не должен помочь. Вам уже неоднократно объяснили, что SQLPrepare() вообще о другом. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 17:11 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
ВладимирМ, Как выглядит строка подключения с опцией MYSQL_OPTION_MULTI_STATEMENTS ? Я пробую не получается. Driver=MySQL ODBC 3.51 Driver;SERVER=***;UID=***;PWD=***;DATABASE=***;PORT=3306;MYSQL_OPTION_MULTI_STATEMENTS= чему равно? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 18:35 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
> Автор: Питон33 > Как выглядит строка подключения с опцией MYSQL_OPTION_MULTI_STATEMENTS ? А с чего ты решил что эта опция должна быть в строке подключения? А может она устанавливается SqlPropSet(или как она там) ? А почему ты не читаешь документацию к используемому драйверу? А почему ты не спросишь, наконец, в форуме по MySql? .... А почему ты решил, что за тебя сделают всю работу? Posted via ActualForum NNTP Server 1.4 ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 18:40 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Код: plaintext
Если ни это, ни чтение мануалов не поможет, тогда переходи на фвмас ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 18:51 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
Игорь Горбонос, Потому что в документации написано: /* connect to server with the CLIENT_MULTI_STATEMENTS option */ if (mysql_real_connect (mysql, host_name, user_name, password, db_name, port_num, socket_name, CLIENT_MULTI_STATEMENTS) == NULL) { printf("mysql_real_connect() failed\n"); mysql_close(mysql); exit(1); } /* execute multiple statements */ Как написать строку подключения в фоксе? Я пробую не получается. Вернее подключение устанавливается но команды разделённые ; не принимает. Driver=MySQL ODBC 3.51 Driver;SERVER=***;UID=***;PWD=***;DATABASE=***;PORT=3306;MYSQL_OPTION_MULTI_STATEMENTS= чему равно? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 18:54 |
|
КАК ПЕРЕДАТЬ ВСЮ ТАБЛИЦУ DBF ОДНОЙ КОМАНДОЙ - ИЗ VFP В MYSQL ???
|
|||
---|---|---|---|
#18+
tanglir Код: plaintext
Если ни это, ни чтение мануалов не поможет, тогда переходи на фвмас Попробовал OPTION=MYSQL_OPTION_MULTI_STATEMENTS а так же OPTION=MYSQL_OPTION_MULTI_STATEMENTS_ON Не помогает. Не принимает команды разделённый точкой с запятой! По отдельности команды принимает и отрабатывает без проблем. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2011, 19:01 |
|
|
start [/forum/topic.php?fid=41&msg=37092223&tid=1584223]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
43ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 154ms |
0 / 0 |