Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе? / 25 сообщений из 33, страница 1 из 2
21.08.2009, 15:54
    #36157275
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Ситуация следующая: имеется 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
23.08.2009, 18:01
    #36158798
Cat2
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
villy_ss,
Все заразы при запросе к DBF сначала копируют DBF с его индексами на клиента.
Решение, если уж никак не уйти от DBF, есть - трехзвенка.
Напишите аппликатионсервер, который будет крутится на вашем файл-сервере.
...
Рейтинг: 0 / 0
24.08.2009, 09:58
    #36159246
villy_ss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
У меня была проблема с кодировкой. Об этом ниже.
Если с кодировкой все в порядке, то VFP9 (Provider='VFPOLEDB.1') может понимать индексы у файлика на сетевом ресурсе. В результате скорость возрастает в 250-300 раз. В моем случае с 14 секунд до 0.05!

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

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

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

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

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


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