powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
25 сообщений из 33, страница 1 из 2
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36157275
villy_ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ситуация следующая: имеется DBF-файл размером 120 Мб расположенный на сетевом диске.
По нему надо сделать банальный селект типа такого
Select * from table where columnname =’1111111111’.

Этот селект выполняется порядка 15 секунд.
Если DBF’ку положить локально, то селект занимает в среднем 4 секунды.
Если еще и проиндексировать по полю, используемому в WHERE, то время его отработки уменьшается раз в двадцать.
Хорошо. Если локально.
Стоит только проиндексировать DBF’ку в сетке, как никакого прироста скорости не наблюдается. Т.е. эта зараза видимо копирует все на клиентскую машину и там делает выборку. Какая именно зараза?
Пробовал пользовать три провайдера:
1. стандартный System.Data.OleDb (Provider=Microsoft.Jet.OLEDB.4.0)
2. VFP9 (Provider='VFPOLEDB.1')
3. ODBC
Первый и последний вообще индексов не понимают (скорость работы с индексом не увеличивается даже на локальной DBF’ке). Второй понимает только локальный индекс(стало быстрее в 20 раз).

Так может и нельзя быстрее-то?
Однако сам VFP6 (у меня шестерка) выборку из проиндексированного файла в сети делает без всякой задержки. Значит можно, только как?

Как можно заставить провайдер не копировать весь объем на локальную машину?
Или из C# нельзя? Только «родным» синтаксисом из FoxPro?

Вообще я слабо знаком с DBF. Поэтому может что-то не так делаю. Например, я не знаю какой именно версией FoxPro был сделан этот 120-мегабайтный DBF-файл. Судя по тому, что в нем DOS-кодировка, то видимо в какой-то старой версии FoxPro. Я же индексирую его через FoxPro 6 версии (что нашел  ). Может быть в этом может быть проблема?

Итого: можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?

Заранее спасибо!
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36158798
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
villy_ss,
Все заразы при запросе к DBF сначала копируют DBF с его индексами на клиента.
Решение, если уж никак не уйти от DBF, есть - трехзвенка.
Напишите аппликатионсервер, который будет крутится на вашем файл-сервере.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36159246
villy_ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня была проблема с кодировкой. Об этом ниже.
Если с кодировкой все в порядке, то VFP9 (Provider='VFPOLEDB.1') может понимать индексы у файлика на сетевом ресурсе. В результате скорость возрастает в 250-300 раз. В моем случае с 14 секунд до 0.05!

По кодировке:
Открываю файл VFP6, он говорит, что кодировка на файле не стоит, а надо поставить.
Раньше я выбирал DOS-кодировку, чтобы текст был читабельный.
Теперь же установил Win1251 - отображаются крякозяблы в колонке с русским текстом (индексировал по другой колонке, где нет кириллицы), зато подхватился индекс, лежащий рядом с файлом DBF на сетевом ресурсе! Также работает, если отменить смену кодировки, которую предлагает VFP6.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36159249
villy_ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. он копирует на локальную машину индекс, который на несколько порядков меньше данных. Потом уже делает выборку по данным...
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36159255
dellv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
работая с DBF файлом, никогда не надейтесь на быструю работу.
Для этого есть SQL сервера..
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36159314
Фотография МСУ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напишите веб-сервис, хостящийся на той машине, где лежит дбф. Вызывайте метод сервиса, который будет возвращать данные в разрезе заданного фильтра. Я бы так поступил. Либо линкед сервер или опенровсет (если Вы работаете с сиквелом и дбф лежит на том же сервере).
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36159400
villy_ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Черт, теперь траблы с кодировкой.

При работе через System.Data.OleDb (Provider=Microsoft.Jet.OLEDB.4.0) не подхватывались индексы, зато не было проблем с кодировкой.
При использовании VFP9 (Provider='VFPOLEDB.1') стали подхватываться индексы, но появились проблемы с кодировкой:

--- Test from dbf (Microsoft.Jet.OLEDB) ---
SNAME=ГОРУЛЕВ,

--- Test from dbf (VFPOLEDB.1) ---
SNAME=???"<:'

,

Т.е. через Microsoft.Jet.OLEDB отображается «Горулев», через VFPOLEDB.1 – совсем даже не то, что надо.

Если открыть эту БД через VFP6 выдается предупреждение, что кодовая страница не установлена. Предлагает установить. Если выбрать MS-DOS (866), то русский текст отображается нормально. Если Windows или нажать Отмена, то крякозяблы.

Строка подключения:
conn = string.Format(@"Provider='VFPOLEDB.1';Data Source='{0}';Extended Properties=dBase IV", path);

Пробовал так:
@"Provider='VFPOLEDB.1';Data Source='{0}';Extended Properties=dBase IV;CODEPAGE=866;"

@"Provider='VFPOLEDB.1';Data Source='{0}';Extended Properties=dBase IV;Collating Sequence=RUSSIAN"

Ничего не помогает.
Но ведь в System.Data.OleDb (Provider=Microsoft.Jet.OLEDB.4.0) проблем не было!
Не в ручную же перекодировать…
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #36159996
villy_ss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Про 29 байт читал. Но нет возможности у меня его править. DBF'ки не мои...
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38236591
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тоже пока не додумаюсь, как ускорить запросы. Лезу в адресный классификатор КЛАДР. Файлы DBF лежат в сетевой расшаренной папке на Win Server 2003. С Win7 запросы проходят еще терпимо. С WinXP можно выспаться. Похоже придется перетаскивать DBF на каждый комп, хоть это и не удобно. Provider=Microsoft.Jet.OLEDB.4.0 Пока больше вариантов не нашел.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38236617
Фотография Владимир СА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bagir !
А не лучше ли перетащить на какой-либо сервер (MSSQL, Oracle, ...)...?
Построить индексы...
И будет счастье...
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38236639
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да наверное лучше, тем более что моя база как раз на скуле и работает. Летает :) Просто не хотел заморачиваться. Хотелось скачать классификатор и просто положить его у себя на сервере. Но похоже придется сделать по вашему.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38236707
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владимир САBagir !
А не лучше ли перетащить на какой-либо сервер (MSSQL, Oracle, ...)...?
Построить индексы...
И будет счастье...
Обычно так все и делают.

А вообще: База данных Федеральной Информационной Адресной Системы

XmlReader + SqlBulkCopy
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237024
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да. Никакие выкрутасы не увеличили скорость до нормально приемлемой. Сейчас сделаю запрос, чтобы вытаскивал из общего кладра указанные области себе в базу на sql. Заранее конечно уверен, что будет летать. А с dbf похоже каши не сваришь, если требуется скорость.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237036
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну почему, с DBF тоже будет летать. Просто надо правильно загружать в БД: DataTable + SqlBulkCopy. Ну и еще правильно хранилище заготовить: индексы, констреинты и пр.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237063
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Погрызу тогда еще. Не силен я в этой теме. Да и с sql тоже пока еще на ВЫ. Но нравится )))) После файловой то помойки
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237106
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Bagir, тогда смотри:

1. Создаем полную копию схемы кладра в ms sql server (оптимизация, индексы, шминдексы потом)
2. Загоняем DBF-ки в свои DataTable Рецепт - Чтение DBF через OleDbConnection
3. Пробегаемся по всем DataTable и раскидываем из в таблички на ms sql server Рецепт - Загрузка DataTable в таблицу БД
4. Радуемся и ликуем от счастья.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237138
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Большое спасибо за напутствия! Ну вот как раз собирался так сделать. Но что то вызывало сомнения. Ну не может так dbf тормозить. Дело вот в чем. Почему то не подтягивались индексы, и работа с DBF была без них. Разные запросы длились от 1 до 14 секунд. Притащил DBF из локальной сети на свой диск, еще раз выполнил индексацию по колонке где идет условие Were, забросил обратно полученные файлы индексов на сервер в расшаренную папку, и вуаля, все запросы идут по 0,1 сек. Это не может не радовать!
А проиндексировать dbf пока они лежат в сетевой папке не выходит. Получаю ошибку -2147467259 "Дисковая или сетевая ошибка". Ради интереса попробую понять почему.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237183
sphinx_mv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagirПогрызу тогда еще. Не силен я в этой теме. Да и с sql тоже пока еще на ВЫ. Но нравится )))) После файловой то помойкиЧтобы не изобретать велосипед с загрузкой данных на SQL-сервер, на досуге лучше погрызть SQL Server Integration Services .
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237412
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SSIS тоже хороший вариант. Древненький рецептик: http://codearticles.ru/home/articleview/1723
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237810
Фотография ЕвгенийВ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sphinx_mvBagirПогрызу тогда еще. Не силен я в этой теме. Да и с sql тоже пока еще на ВЫ. Но нравится )))) После файловой то помойкиЧтобы не изобретать велосипед с загрузкой данных на SQL-сервер, на досуге лучше погрызть SQL Server Integration Services .
SSIS - для сложных сценариев, а тут надо то загрузить из одной таблицы в другую.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237826
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВSSIS - для сложных сценариев, а тут надо то загрузить из одной таблицы в другую.
SSIS - это компонент, который решает задачи миграции данных. Сложность воркфлоу тут вообще ни при чем. Сложные сценарии можно на любом языке программирования выполнять.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38237835
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЕвгенийВ, то, что ты показал - разовая ручная мапипуляция со всеми вытекающими проблемами. Хотя бы такими, что маппинги нужно ручками дорабатывать. При чуть более сложных схемах такие манипуляции уже идут далеко в лес. Интеграция (синхронизация) с кладром - это периодическая операция, которая так или иначе должна выполняться в атоматическом режиме. Делай выводы.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238126
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, бесспорно, если перетаскивать таблицы КЛАДРА с свою базу, то нужна обработка. Кладр периодически обновляется. Хотя если нет необходимости в постоянной наличии актуальной копии, то можно и руками все перетащить. Я сейчас пока что остановился на варианте запросов непосредственно в DBF кладра, предварительно проиндексировав его таблицы по полю CODE (по которому идет запрос WHERE). Долго длится только запрос по выбору областей. Примерно 1-2 сек. Остальные быстро. 0,1-0,2 сек. При этом файлы лежат в локальной сети на сервере в расашенной папке. Если перетащить их к себе на диск, то все намного быстрее. Но меня и первый вариант устраивает. Обновлять проще.
Единственное, не получается проиндексировать DBF в сетевой папке. Если перетащить к себе на комп - бес проблем. Потом забрасываю на сервер уже с файлами индексов.
А подскажите как переиндескировать?
Создаю индексы так:
CREATE INDEX KLADR ON KLADR.DBF (CODE)
удаляю так:
DROP INDEX KLADR ON KLADR.DBF
где KLADR имя индекса.
Или можно как то проверить наличие индекса?
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238154
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagirЯ сейчас пока что остановился на варианте запросов непосредственно в DBF кладра
Отвратительная архитектура тоже архитектура, мучайся дальше с этим мусором. Когда частота пользовательских запросов повысится, нагрузка будет давить не только на нераспределенную DBF свалку, но и на твой моск.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238288
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, я представляю о чем речь. Просто в разрезе моей задачи это совершенно не актуально. Локальная сеть, 6 пользователей. Ну вот и все. База данных на Microsoft Office Access 2003. Обороняется при такой небольшой нагрузке на ура. Ну а форма для работы с кладром сейчас долбится к DBF. Те же 6 пользователей, причем практически одновременные запросы очень редки. Пробовали для теска все вместе - не тормозит.
Конечно, можно сделать намного интересней и лучше, но для данной задачи достаточно и так. Просто еще куча других не реализованных планов.
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]