powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
33 сообщений из 33, показаны все 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
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238308
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagirДа, я представляю о чем речь. Просто в разрезе моей задачи это совершенно не актуально.
Хорошее решение актуально всегда и везде. Это проявляется потом, когда появятся еще пользователи. Или когда возникнут доработки и масштабирование системы. А с нуля на колене оно всегда всё просто и элементарно.

BagirЛокальная сеть, 6 пользователей. Ну вот и все. База данных на Microsoft Office Access 2003.
Ужос... Чем не устроил полноценный MS SQL Server Express?

BagirПросто еще куча других не реализованных планов.
Трудозатраты практически одинаковые. Написать чуток кода, который раскидывает DBF файлы в MS SQL Server Express, час делов.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238446
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Убедили, честно! Сегодня доделаю вставку формы редактора адреса в программы, чтобы уже работало. Потом сделаю импорт таблиц в sql и "потихоньку" переведу запросы туда.
По поводу MS SQL Server Express. Великолепная игрушка! Просто я совсем недавно начал осваивать скуль. И годы практики в VBA тут не особенно то помогли. Выбор Microsoft Office Access 2003 был просто случайностью. Полез в тему sql совершенно не понимая чего это такое и как пользоваться. То есть на тот момент я вообще не видел разницы. Желание было только одно. Свалить с файловой помойки. В виду большого их количества, все начало уже подтормаживать. Да и статистику с них просто не соберешь.
Сейчас уже понимаю что SQL Server даже в моем варианте был бы намного интересней. Но я пока что даже не читал про него, хоть это и в планах.
Раз уж убедили меня перенести все в скуль, скажите, те тормезнет ли это работу моей базы, если таблицы кладра я размещу в этом же файле MS SQL Server Express? База сейчас весит 100 мегабайт. Размер по моему детский для скуля. Но все же хотелось бы услышать совет.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238476
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagirИ годы практики в VBA тут не особенно то помогли.
Забудь про эти ужасы. Есть .NET, есть бесплатные легкие вменяемые СУБД (MS SQL Server Express, Oracle Express), есть замечательные ORM - этого предостаточно, чтобы писать правильные вещи.

BagirЖелание было только одно. Свалить с файловой помойки. В виду большого их количества, все начало уже подтормаживать. Да и статистику с них просто не соберешь.
Вот это здравое желание. А если к нему, помимо статистики, добавить управление уровнем изоляции транзакций, отруливание блокировками, и прочее, присущее адекватным современным СУБД, то я молчу. А потом захочится прикрутить отчеты - не вопрос, есть халявный Reporting Services. Ну и так далее.

BagirРаз уж убедили меня перенести все в скуль, скажите, те тормезнет ли это работу моей базы, если таблицы кладра я размещу в этом же файле MS SQL Server Express? База сейчас весит 100 мегабайт. Размер по моему детский для скуля. Но все же хотелось бы услышать совет.
Это копейки для экспресса. Максимальный размер реляционной базы данных 10 Гб.

Требования к оборудованию и программному обеспечению для установки SQL Server 2012
Возможности, поддерживаемые различными выпусками SQL Server 2012
Microsoft® SQL Server® 2012 Express
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238497
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
VBA умирающий вид, это я заню. Но просто так перепрыгнуть на .NET у меня уже не получится. Горы кода переписать придется. Да и .NET я не знаю. Для начала надо его изучить. А вот уйти на SQL Server очень бы хотелось. Пока представляю это так. На серверной машине (Win Ser 2003) будет установлен SQL Server, и файлы баз данных уже не будут лежать не в расшаренной папке. А вот что изменится в программах я пока еще не читал. Ну наверное строка соединения это уж точно. А вот сами запросы надеюсь что останутся те же.
За ссылки огромное спасибо. буду читать! А пока что за отсутствием хоть какого то представления о задаче даже спросить нечего ))
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238511
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотел было тебе впаять еще распределенность на SOA, чтобы ты честную трехзвенку делал на WCF (или ASP.NET серверное приложение), но прочитал последний пост и... передумал :)
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238521
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну я вообще способный ученик )) Только пнуть надо в правильном направлении. Времени конечно на самообразование как и у всех не хватает, да и порой спросить не у кого.
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238528
cooldeveloper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну заходи почаще тогда :) У нас уже был один акцессовский воспитанник, сейчас уже блоги ведет по дотнетам с автокадами и в ус не дует. Конечно же это замечательный Андрей Композитум
...
Рейтинг: 0 / 0
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
    #38238536
Bagir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Обязательно, и спасибо за помощь! Следующие два месяца у меня каникулы в больших ковычках. Но время на освоение новых задач будет много. Вот и займусь переходом на SQL Server.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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