|
Вопрос # 2 553/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты!
Нужна Ваша помощь в ускорении выполнения запросов к DBF-файлам через ADO. При обработке одной записи реестра требуется обратиться к очень многим справочным таблицам и поэтому время, за которое программа проходит одну запись стремится к секунде. А в реестре может быть тысячи записей.
Запросы все оптимизированы - во-первых использую параметры, во-вторых CommandText задаю в программе лишь один раз, в третьих prepared устанавливаю в true(сразу после установки CommadText).
Использую драйвер Microsoft.Jet.OLEDB.4.0(dBase III), который, вероятно и виноват в медленной работе запросов. Пытался использовать драйвер Microsoft Visual FoxPro OLE DB Provider, но, как я ни старался - он не воспринимает таблицы DBF на русском, видит абракадабру. В приложении находятся оба варианта ConnectionString.
Помогите, пожалуйста, разобраться - либо найти альтернативный путь ускорения выполнения запросов, либо найти способ использования VFPOLEDB с "русскими" таблицами!
Пишу на Delphi 2007. Спасибо заранее
Приложение: Переключить в обычный режим-
-
- const ConnectionString = 'Provider=Microsoft.Jet.OLEDB.4.0;' +
- 'Data Source=%s;' +
- 'Extended Properties=dBase III;' +
- 'Persist Security Info=False';
-
-
-
- ConnectionString = 'Provider=VFPOLEDB.1;' +
- 'Data Source=%s;' +
- 'Password="";' +
- 'Collating Sequence=MACHINE;' +
- 'CODEPAGE=1251;';
-
 |
Вопрос задал: RedMask (статус: Посетитель)
Вопрос отправлен: 23 марта 2009, 08:04
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Тов. Женька
Здравствуйте, RedMask!
Я думаю, здесь было бы лучше использовать Advantage TDataSet. Сам им активно пользуюсь.Скорость высокая, корректно работает с русским языком. SQL также прилично развит.
Скачать можно тут (заполните форму, появятся ссылки для скачивания): http://www.sybase.com/download_ads
 |
Ответ отправил: Тов. Женька (статус: 3-ий класс)
Время отправки: 23 марта 2009, 09:12
Оценка за ответ: 5
Комментарий к оценке: Спасибо! Разбирусь с Advantage! Возможно подойдёт, но тем не менее я не прекращаю поисков! :)
|
Мини-форум вопроса
Всего сообщений: 13; последнее сообщение — 24 марта 2009, 13:06; участников в обсуждении: 4.
|
Вадим К (статус: Академик), 23 марта 2009, 09:26 [#1]:
Сложно советовать, ведь не известно, как там у Вас внутри. Может быть для того, что бы найти в таблице нужную запись, вы в цикле перебираете всю её и смотрите, какие записи подходят вместо того, что бы написать один большой сиквел запрос.
язык SQL очень интересный язык, так как позволяет написать один красивый запрос, и будет выполнено работы, которую в коде будет на несколько страниц.
Не надейтесь, что Ваш цикл по записям будет быстрее, чем драйвер БД пробежится по ним. Это самое популярное заблуждение. Например сумму по какому то полю лучше сосчитать через select sum(pole) from tablename.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Тов. Женька (статус: 3-ий класс), 23 марта 2009, 09:39 [#2]:
Технология ADO сама по себе не очень быстрая. Но не в этом минус, если не вдаваться в дебри. Минус, на мой взгляд в универсальности этой технологии. В случае с DBF все-таки лучше использовать специализированные решения.
|
|
RedMask (статус: Посетитель), 23 марта 2009, 11:31 [#3]:
Спасибо за ответы.
Вадим К, я согласен, важно написать оптимально написать sql-запросы, это экономит массу времени работы программы(убедился на собственном опыте). Но в данном случае речь идёт об очень простых запросах типо "select что-то from таблица where нечто = :параметру". Запросы простые, а структура базы данных сложная и напутанная. При обработке одной записи приходится обращаться в 5-7 таблиц, причём(предчувствуя предложение объеденить доступ к таблицам в один запрос) важны в программе результаты не только последнего запроса, но и всех. После того, как я вылизал все запросы, время проверки записи уменьшилось с 1,16 до 0,93 секунды, что конечно быстрее, но всё равно долго. FoxPro однозначно работает бытрее, но, к сожалению русского не понимает. Пример (подсчёта суммы) утрирован?
Тов. Женька, я не очень разбираюсь в технологиях доступа, буду иметь ввиду. Спасибо. Кроме Advantage альтернативы другой не знаете?
|
|
RedMask (статус: Посетитель), 23 марта 2009, 11:44 [#4]:
Может использовать BDE? %)
|
|
Тов. Женька (статус: 3-ий класс), 23 марта 2009, 11:45 [#5]:
Достойной альтернативы не знаю. Есть C4Base (так, кажется), но что-то мудреный, на счет поддержки русского не знаю (компонент использовался в Бизнес Пак до 6-й версии включительно), к тому же платный. Есть и Apollo, практически близнец C4Base и тоже платный. Оба не рекомендую.
Не знаю какие индексы вы используете, вероятно, MDX. Advantage делает фоксовские - CDX, что в плане совместимости хорошо.
|
|
Тов. Женька (статус: 3-ий класс), 23 марта 2009, 11:47 [#6]:
BDE не стоит использовать, там тоже не все гладко с кодировкой, да и настройка муторная.
|
|
Вадим К (статус: Академик), 23 марта 2009, 17:28 [#7]:
Есть ещё компонент TBdf. У него работа немного топорная (то есть сложных сиквел запросов не получиться, хотя может сейчас всё поменялось, давно я его трогал). Работает быстро. Проблемы с кодировкой иногда решаются весьма нетривиальным способом - у меня была база, которая непонятно как была создана и в результате в ней внутри был дважды перекодированный текст. Никакими настройками не удавалось обойти. А с компонентом этим просто. Он с исходниками, я нашёл метод, который читает строки и добавил туда двойную декодировку (ну и кодировку позже). Скорость работы была более чем достаточной. Но у меня основная задача - это было пробежаться по записям и конвертировать в другую базу (FireBird). А вот с той базой уже можно было работать
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Косолапов Дмитрий Юрьевич (статус: 8-ой класс), 24 марта 2009, 10:25 [#8]:
Кстати а может действительно переконвертировать dbf-ы в одну базу какого-нибудь Access, например?
|
|
RedMask (статус: Посетитель), 24 марта 2009, 11:52 [#9]:
Тов. Женька
Спасибо за подсказку, я на вооружение взял Advantage, но пока не используем.
Мы пока переделали под BDE и программа заработала в 4 раза быстрее, этого уже вполне достаточно.
Вадим К
Мы используем TDBF для загрузки реестра в память, помоему это отличный компонент последовательного доступа, но выборки с ним не сделать.
Косолапов Дмитрий Юрьевич
Насчёт переконвертирование - это мысль тоже хорошая. Но не всю базу можно конвертировать, а только те поля, которые нужны для программы. т.е. получится не база, а таблица. Формат базы мы менять не имеем права, база государственная(и причём база не одна, а их много %)))
Посмотрим, как дальше дело пойдёт. Всем спасибо за ответы!
|
|
Вадим К (статус: Академик), 24 марта 2009, 12:09 [#10]:
Иногда, когда говорят, что программа работает медленно, не понимают, что это и есть максимальная скорость. Либо просто выбранный алгоритм не позволяет физически быстрее.
Поэтому, если работает "медленно", надо обычно менять алгоритм.
В данном случае, я взял бы два варианта на присмотр.
Если база не очень большая, а выборок надо делать много и банальных, то я бы их просто грузил все в память в массив структур (конечно, это дело завернуто в классы должно быть) и оттудова уже работал.
Если база большая и запросов надо делать много и сложных, то проще конвертнуть в свою базу и оттудова делать выборку. В последствии можно придумать "синхронизацию", что бы все записи каждый раз не перезаписывать.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Вадим К (статус: Академик), 24 марта 2009, 12:10 [#11]:
А BDE.... она кешировать в некоторых случаях может хорошо. Наверно на этом Вы и попались - то, как оно умеет кешировать подошло Вам. Но лучше аккуратно с ним.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
RedMask (статус: Посетитель), 24 марта 2009, 12:26 [#12]:
Вадим К
Пока мы сделали BDE, потому что пишем программу в режиме аврала. Действительно с БДЕ, быстрее стало, причём никаких запросов не менял, просто сменил технологию.(может кому поможет)
Но позже конечно, лучше сделать пак из базы данных - только то, что нужно для работы. Будет, наверное, совсем быстро
|
|
Тов. Женька (статус: 3-ий класс), 24 марта 2009, 13:06 [#13]:
Когда дело дойдет до реальной работы, производительность BDE может резко упасть.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|