|
Можно ли средствами 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 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
BagirДа, я представляю о чем речь. Просто в разрезе моей задачи это совершенно не актуально. Хорошее решение актуально всегда и везде. Это проявляется потом, когда появятся еще пользователи. Или когда возникнут доработки и масштабирование системы. А с нуля на колене оно всегда всё просто и элементарно. BagirЛокальная сеть, 6 пользователей. Ну вот и все. База данных на Microsoft Office Access 2003. Ужос... Чем не устроил полноценный MS SQL Server Express? BagirПросто еще куча других не реализованных планов. Трудозатраты практически одинаковые. Написать чуток кода, который раскидывает DBF файлы в MS SQL Server Express, час делов. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 14:45 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Убедили, честно! Сегодня доделаю вставку формы редактора адреса в программы, чтобы уже работало. Потом сделаю импорт таблиц в sql и "потихоньку" переведу запросы туда. По поводу MS SQL Server Express. Великолепная игрушка! Просто я совсем недавно начал осваивать скуль. И годы практики в VBA тут не особенно то помогли. Выбор Microsoft Office Access 2003 был просто случайностью. Полез в тему sql совершенно не понимая чего это такое и как пользоваться. То есть на тот момент я вообще не видел разницы. Желание было только одно. Свалить с файловой помойки. В виду большого их количества, все начало уже подтормаживать. Да и статистику с них просто не соберешь. Сейчас уже понимаю что SQL Server даже в моем варианте был бы намного интересней. Но я пока что даже не читал про него, хоть это и в планах. Раз уж убедили меня перенести все в скуль, скажите, те тормезнет ли это работу моей базы, если таблицы кладра я размещу в этом же файле MS SQL Server Express? База сейчас весит 100 мегабайт. Размер по моему детский для скуля. Но все же хотелось бы услышать совет. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 15:45 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
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 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 15:58 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
VBA умирающий вид, это я заню. Но просто так перепрыгнуть на .NET у меня уже не получится. Горы кода переписать придется. Да и .NET я не знаю. Для начала надо его изучить. А вот уйти на SQL Server очень бы хотелось. Пока представляю это так. На серверной машине (Win Ser 2003) будет установлен SQL Server, и файлы баз данных уже не будут лежать не в расшаренной папке. А вот что изменится в программах я пока еще не читал. Ну наверное строка соединения это уж точно. А вот сами запросы надеюсь что останутся те же. За ссылки огромное спасибо. буду читать! А пока что за отсутствием хоть какого то представления о задаче даже спросить нечего )) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 16:09 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Хотел было тебе впаять еще распределенность на SOA, чтобы ты честную трехзвенку делал на WCF (или ASP.NET серверное приложение), но прочитал последний пост и... передумал :) ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 16:16 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Ну я вообще способный ученик )) Только пнуть надо в правильном направлении. Времени конечно на самообразование как и у всех не хватает, да и порой спросить не у кого. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 16:19 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Ну заходи почаще тогда :) У нас уже был один акцессовский воспитанник, сейчас уже блоги ведет по дотнетам с автокадами и в ус не дует. Конечно же это замечательный Андрей Композитум ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 16:22 |
|
Можно ли средствами C# сделать быстрый запрос по большой DBF’ке на сетевом ресурсе?
|
|||
---|---|---|---|
#18+
Обязательно, и спасибо за помощь! Следующие два месяца у меня каникулы в больших ковычках. Но время на освоение новых задач будет много. Вот и займусь переходом на SQL Server. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.04.2013, 16:26 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1404798]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
2ms |
others: | 8ms |
total: | 165ms |
0 / 0 |