|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Ситуация следующая: имеется 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’ке на сетевом ресурсе? Заранее спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
21.08.2009, 15:54 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
villy_ss, Все заразы при запросе к DBF сначала копируют DBF с его индексами на клиента. Решение, если уж никак не уйти от DBF, есть - трехзвенка. Напишите аппликатионсервер, который будет крутится на вашем файл-сервере. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.08.2009, 18:01 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
У меня была проблема с кодировкой. Об этом ниже. Если с кодировкой все в порядке, то VFP9 (Provider='VFPOLEDB.1') может понимать индексы у файлика на сетевом ресурсе. В результате скорость возрастает в 250-300 раз. В моем случае с 14 секунд до 0.05! По кодировке: Открываю файл VFP6, он говорит, что кодировка на файле не стоит, а надо поставить. Раньше я выбирал DOS-кодировку, чтобы текст был читабельный. Теперь же установил Win1251 - отображаются крякозяблы в колонке с русским текстом (индексировал по другой колонке, где нет кириллицы), зато подхватился индекс, лежащий рядом с файлом DBF на сетевом ресурсе! Также работает, если отменить смену кодировки, которую предлагает VFP6. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2009, 09:58 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Т.е. он копирует на локальную машину индекс, который на несколько порядков меньше данных. Потом уже делает выборку по данным... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2009, 10:00 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
работая с DBF файлом, никогда не надейтесь на быструю работу. Для этого есть SQL сервера.. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2009, 10:02 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Напишите веб-сервис, хостящийся на той машине, где лежит дбф. Вызывайте метод сервиса, который будет возвращать данные в разрезе заданного фильтра. Я бы так поступил. Либо линкед сервер или опенровсет (если Вы работаете с сиквелом и дбф лежит на том же сервере). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2009, 10:34 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Черт, теперь траблы с кодировкой. При работе через 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) проблем не было! Не в ручную же перекодировать… ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2009, 11:17 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Про 29 байт читал. Но нет возможности у меня его править. DBF'ки не мои... ... |
|||
:
Нравится:
Не нравится:
|
|||
24.08.2009, 15:15 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Тоже пока не додумаюсь, как ускорить запросы. Лезу в адресный классификатор КЛАДР. Файлы DBF лежат в сетевой расшаренной папке на Win Server 2003. С Win7 запросы проходят еще терпимо. С WinXP можно выспаться. Похоже придется перетаскивать DBF на каждый комп, хоть это и не удобно. Provider=Microsoft.Jet.OLEDB.4.0 Пока больше вариантов не нашел. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 14:08 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Bagir ! А не лучше ли перетащить на какой-либо сервер (MSSQL, Oracle, ...)...? Построить индексы... И будет счастье... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 14:19 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Да наверное лучше, тем более что моя база как раз на скуле и работает. Летает :) Просто не хотел заморачиваться. Хотелось скачать классификатор и просто положить его у себя на сервере. Но похоже придется сделать по вашему. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 14:32 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Владимир САBagir ! А не лучше ли перетащить на какой-либо сервер (MSSQL, Oracle, ...)...? Построить индексы... И будет счастье... Обычно так все и делают. А вообще: База данных Федеральной Информационной Адресной Системы XmlReader + SqlBulkCopy ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 14:59 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Да. Никакие выкрутасы не увеличили скорость до нормально приемлемой. Сейчас сделаю запрос, чтобы вытаскивал из общего кладра указанные области себе в базу на sql. Заранее конечно уверен, что будет летать. А с dbf похоже каши не сваришь, если требуется скорость. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 17:12 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Ну почему, с DBF тоже будет летать. Просто надо правильно загружать в БД: DataTable + SqlBulkCopy. Ну и еще правильно хранилище заготовить: индексы, констреинты и пр. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 17:18 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Погрызу тогда еще. Не силен я в этой теме. Да и с sql тоже пока еще на ВЫ. Но нравится )))) После файловой то помойки ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 17:30 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Bagir, тогда смотри: 1. Создаем полную копию схемы кладра в ms sql server (оптимизация, индексы, шминдексы потом) 2. Загоняем DBF-ки в свои DataTable Рецепт - Чтение DBF через OleDbConnection 3. Пробегаемся по всем DataTable и раскидываем из в таблички на ms sql server Рецепт - Загрузка DataTable в таблицу БД 4. Радуемся и ликуем от счастья. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 17:51 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Большое спасибо за напутствия! Ну вот как раз собирался так сделать. Но что то вызывало сомнения. Ну не может так dbf тормозить. Дело вот в чем. Почему то не подтягивались индексы, и работа с DBF была без них. Разные запросы длились от 1 до 14 секунд. Притащил DBF из локальной сети на свой диск, еще раз выполнил индексацию по колонке где идет условие Were, забросил обратно полученные файлы индексов на сервер в расшаренную папку, и вуаля, все запросы идут по 0,1 сек. Это не может не радовать! А проиндексировать dbf пока они лежат в сетевой папке не выходит. Получаю ошибку -2147467259 "Дисковая или сетевая ошибка". Ради интереса попробую понять почему. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 18:01 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
BagirПогрызу тогда еще. Не силен я в этой теме. Да и с sql тоже пока еще на ВЫ. Но нравится )))) После файловой то помойкиЧтобы не изобретать велосипед с загрузкой данных на SQL-сервер, на досуге лучше погрызть SQL Server Integration Services . ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 18:35 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
SSIS тоже хороший вариант. Древненький рецептик: http://codearticles.ru/home/articleview/1723 ... |
|||
:
Нравится:
Не нравится:
|
|||
23.04.2013, 22:39 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
sphinx_mvBagirПогрызу тогда еще. Не силен я в этой теме. Да и с sql тоже пока еще на ВЫ. Но нравится )))) После файловой то помойкиЧтобы не изобретать велосипед с загрузкой данных на SQL-сервер, на досуге лучше погрызть SQL Server Integration Services . SSIS - для сложных сценариев, а тут надо то загрузить из одной таблицы в другую. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:30 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
ЕвгенийВSSIS - для сложных сценариев, а тут надо то загрузить из одной таблицы в другую. SSIS - это компонент, который решает задачи миграции данных. Сложность воркфлоу тут вообще ни при чем. Сложные сценарии можно на любом языке программирования выполнять. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:36 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
ЕвгенийВ, то, что ты показал - разовая ручная мапипуляция со всеми вытекающими проблемами. Хотя бы такими, что маппинги нужно ручками дорабатывать. При чуть более сложных схемах такие манипуляции уже идут далеко в лес. Интеграция (синхронизация) с кладром - это периодическая операция, которая так или иначе должна выполняться в атоматическом режиме. Делай выводы. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 11:39 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Да, бесспорно, если перетаскивать таблицы КЛАДРА с свою базу, то нужна обработка. Кладр периодически обновляется. Хотя если нет необходимости в постоянной наличии актуальной копии, то можно и руками все перетащить. Я сейчас пока что остановился на варианте запросов непосредственно в DBF кладра, предварительно проиндексировав его таблицы по полю CODE (по которому идет запрос WHERE). Долго длится только запрос по выбору областей. Примерно 1-2 сек. Остальные быстро. 0,1-0,2 сек. При этом файлы лежат в локальной сети на сервере в расашенной папке. Если перетащить их к себе на диск, то все намного быстрее. Но меня и первый вариант устраивает. Обновлять проще. Единственное, не получается проиндексировать DBF в сетевой папке. Если перетащить к себе на комп - бес проблем. Потом забрасываю на сервер уже с файлами индексов. А подскажите как переиндескировать? Создаю индексы так: CREATE INDEX KLADR ON KLADR.DBF (CODE) удаляю так: DROP INDEX KLADR ON KLADR.DBF где KLADR имя индекса. Или можно как то проверить наличие индекса? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 13:33 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
BagirЯ сейчас пока что остановился на варианте запросов непосредственно в DBF кладра Отвратительная архитектура тоже архитектура, мучайся дальше с этим мусором. Когда частота пользовательских запросов повысится, нагрузка будет давить не только на нераспределенную DBF свалку, но и на твой моск. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 13:43 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Да, я представляю о чем речь. Просто в разрезе моей задачи это совершенно не актуально. Локальная сеть, 6 пользователей. Ну вот и все. База данных на Microsoft Office Access 2003. Обороняется при такой небольшой нагрузке на ура. Ну а форма для работы с кладром сейчас долбится к DBF. Те же 6 пользователей, причем практически одновременные запросы очень редки. Пробовали для теска все вместе - не тормозит. Конечно, можно сделать намного интересней и лучше, но для данной задачи достаточно и так. Просто еще куча других не реализованных планов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 14:39 |
|
|
start [/forum/topic.php?fid=20&fpage=166&tid=1404798]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
96ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 202ms |
0 / 0 |