powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Автоподбор индекса в запросах
31 сообщений из 31, показаны все 2 страниц
Автоподбор индекса в запросах
    #35457947
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую FoxPro для доступа к 1С(ДБФ)

В таблицах 1С индексы сделаны ввиде достаточно сложных выражений.
Например в таблице "журнала документов" есть поле Date,
но нет индекcа по этому полю, а есть индекс на выражение
Код: plaintext
DTOS(date)+time+iddoc

Соответственно, когда пишу условие в запросе
1.
Код: plaintext
WHERE Журнал.Date BETWEEN Дата1 AND Дата2
левое выражение не является индексным и происходит полный скан таблицы, даже если
разница между датами 1 день.

Я могу переписать условие
2.
Код: plaintext
WHERE DTOS(Журнал.date)+Журнал.time+Журнал.iddoc BETWEEN Дата1 AND Дата2
условие идентично (1.) но теперь левое выражение полностью попадает в индекс и запрос выполняется исключительно быстро (P.S> предустановка SET ANSI OFF)

Единственная проблема очень тяжело так переписывать каждый запрос.
А если условия динамические(зависят от выбора пользователя) - вообще труба.
Не существует ли парсера или способа, который бы преобразовывал исходный запрос в такой,
чтобы там где возможно неиндексные выражения заменялись на индексные (авто) ?
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35457965
Нет. Компьютеры думать еще не умеют. Или подстраивайтесь под имеющиеся индексы или делайте дополнительные индексы под свои запросы.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35457987
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kiruhaЯ могу переписать условие
2.
Код: plaintext
WHERE DTOS(Журнал.date)+Журнал.time+Журнал.iddoc BETWEEN Дата1 AND Дата2

Автоматом ни как, только подстраиваться под имеющиеся индексы, но "+Журнал.time+Журнал.iddoc" можно не дописывать думаю.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35457991
могу дать пример парсера Sql строки

далее Вы уже самомтоятельно
можете посмотреть по атагинфо сущ-е индексов,
необходимых для вкл-я оптимизатора
и создание их

но Вам будет необходим моноп-й доступ к таблицам + уверенность, что
наличие доп-х индексн.тегов не повлияет на работу 1С
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35458001
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12345вышелзайчикпогулять + уверенность, что
наличие доп-х индексн.тегов не повлияет на работу 1С
+ уверенность что 1С не убъет дополнительные индексы.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35458082
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.Нет. Компьютеры думать еще не умеют. Или подстраивайтесь под имеющиеся индексы или делайте дополнительные индексы под свои запросы.

В самых простейших случаях я парсер написал - думал может тоже кто.

SQLLite умееет подбирать индексы автоматически для CDX.

Dima T kiruhaЯ могу переписать условие
2.
Код: plaintext
WHERE DTOS(Журнал.date)+Журнал.time+Журнал.iddoc BETWEEN Дата1 AND Дата2

Автоматом ни как, только подстраиваться под имеющиеся индексы, но "+Журнал.time+Журнал.iddoc" можно не дописывать думаю.

Провел тесты - не использует.
..........
P.S. Небольшая ошибка - в случае 2
Код: plaintext
WHERE DTOS(Журнал.date) BETWEEN DTOS(Дата1) AND DTOS(Дата2)
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35458096
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
12345вышелзайчикпогулятьмогу дать пример парсера Sql строки

далее Вы уже самомтоятельно
можете посмотреть по атагинфо сущ-е индексов,
необходимых для вкл-я оптимизатора
и создание их

но Вам будет необходим моноп-й доступ к таблицам + уверенность, что
наличие доп-х индексн.тегов не повлияет на работу 1С

Это было бы крайне интересно - поэтому и завел тему...

Не очень понял зачем монопольный доступ - я строку запроса преобразую
к другой строке запроса....
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35458106
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поправка к коду для случая 2 (использование индекса).

Код: plaintext
WHERE DTOS(Журнал.date)+Журнал.time+Журнал.iddoc BETWEEN DTOS(Дата1) AND DTOS(Дата2)
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35458178
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T 12345вышелзайчикпогулять + уверенность, что
наличие доп-х индексн.тегов не повлияет на работу 1С
+ уверенность что 1С не убъет дополнительные индексы.

Добавлять новые индексы не хотелось.
1. Это увеличивает и без того огромные файлы CDX
2. В самой документации по FoxPro рекомендовано не плодить дополнительные
индексы а использовать выражения (если нужны индексы DATE и DTOS(Журнал.date)+Журнал.time например)
3. Механизм требуется для разных баз и конфигураций
4. 1С не обновляет "чужие" индексы при записи.
5. При изменении конфигурации 1С убивает "чужие" индексы, даже если они прописаны в спец файле (DD)
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35473069
AndreyB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Лучше обращаться к БД 1С через OLE объекты

o1c = Createobject("V77.Application")
....
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35473545
Kruchinin Pahan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreyBЛучше обращаться к БД 1С через OLE объекты

o1c = Createobject("V77.Application")
....
Ага, сначала ждешь, пока база подымется. В зависимости от навороченности базы от секунд, до минут. Потом ждешь, пока 1С провернет то, что ты от нее хочешь. Потом ждешь, пока OLEVariant дважды конвертнувшись вернется в VFP. То что в случае прямого доступа к базе измеряется миллисекундами, через OLE тянется минутами... часами...
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474211
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уточню структуру индексов в 1С - возможно непонимание из за этого -
все индексные выражения представляют собой простое строковое сложение полей таблицы,
если поле не строкового типа - оно конвертируется в строку
т.е. имеет вид
f1(a1)+f2(а2)+f3(а3)+...
где а - имя поля, например date
f - функция преобразования в строку (или ее отсутствие, если уже строка), например DTOS для дат

- т.е. они представляют собой аналог индекса SQL по нескольким полям

Я думал, что в foxpro на практике также используют "индексы по нескольким полям",
но тогда должна была всплыть эта проблема...
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474310
kiruhaУточню структуру индексов в 1С - возможно непонимание из за этого -
все индексные выражения представляют собой простое строковое сложение полей таблицы,
если поле не строкового типа - оно конвертируется в строку
т.е. имеет вид
f1(a1)+f2(а2)+f3(а3)+...
где а - имя поля, например date
f - функция преобразования в строку (или ее отсутствие, если уже строка), например DTOS для дат

Это и так уже известно. Индексы в фоксе точно такие же.

- т.е. они представляют собой аналог индекса SQL по нескольким полям

А вот это вот большоей заблуждение.

Я думал, что в foxpro на практике также используют "индексы по нескольким полям",
но тогда должна была всплыть эта проблема...

Фокс индексирует результаты выражения. То есть результат DTOS(date)+time+iddoc, к примеру, будет для записи равен '20080715152345WJEJRJT'. И вот этот результат и будет положен в индекс для этой записи. Это совершенно не список полей (date,time,iddoc), который бы использовал SQL сервер. И SQL сервер может из индекса вытащить значение одного из полей индекса. А в фоксе как Вы это предполагаете сделать?
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474504
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.

Я думал, что в foxpro на практике также используют "индексы по нескольким полям",
но тогда должна была всплыть эта проблема...

Фокс индексирует результаты выражения. То есть результат DTOS(date)+time+iddoc, к примеру, будет для записи равен '20080715152345WJEJRJT'. И вот этот результат и будет положен в индекс для этой записи. Это совершенно не список полей (date,time,iddoc), который бы использовал SQL сервер. И SQL сервер может из индекса вытащить значение одного из полей индекса. А в фоксе как Вы это предполагаете сделать?

В примитиве у меня сделано так.
Ищу Where и On
Если встречается в них
1.
Код: plaintext
WHERE КакаяТоТаблица.Date BETWEEN Дата1 AND Дата2
смотрю все индексы таблицы КакаяТоТаблица. Если в таблице индексов индекс начинается с DTOS(Таблица.Date)
беру выражение этого индекса :
Код: plaintext
 DTOS(date)+time+iddoc 
и заменяю строку 1. на
2.
Код: plaintext
 WHERE DTOS(Журнал.date)+Журнал.time+Журнал.iddoc BETWEEN DTOS(Дата1) AND DTOS(Дата2) BETWEEN DTOS(Дата1) AND DTOS(Дата2)

Это в примитиве.
В более полном варианте нужно анализировать несколько предложений в WHERE,
предложение IN , INLIST, вложенные подзапросы и т.п., не знаю почему эту работу драйвер не может взять на себя
(драйвер SqlLite эту работу производит)
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474528
kiruhaВ примитиве у меня сделано так.
Ищу Where и On
Если встречается в них
1.
Код: plaintext
WHERE КакаяТоТаблица.Date BETWEEN Дата1 AND Дата2
смотрю все индексы таблицы КакаяТоТаблица. Если в таблице индексов индекс начинается с DTOS(Таблица.Date)
беру выражение этого индекса :
Код: plaintext
 DTOS(date)+time+iddoc 
и заменяю строку 1. на
2.
Код: plaintext
 WHERE DTOS(Журнал.date)+Журнал.time+Журнал.iddoc BETWEEN DTOS(Дата1) AND DTOS(Дата2) BETWEEN DTOS(Дата1) AND DTOS(Дата2)

Это в примитиве.
В более полном варианте нужно анализировать несколько предложений в WHERE,
предложение IN , INLIST, вложенные подзапросы и т.п., не знаю почему эту работу драйвер не может взять на себя
(драйвер SqlLite эту работу производит)
Какую эту? Что такое драйвер SqlLite? К чему он подключается? На чем основано утверждение, что "эту работу производит"?
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474573
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.
Какую эту? Что такое драйвер SqlLite? К чему он подключается? На чем основано утверждение, что "эту работу производит"?

В принципе это к проблеме мало имеет отношения, но если интересно
(SqlLite по русски)
внешняя компонента для 1С позволяющая подключать SqlLite
Тесты(в том числе планы запроса по подбору оптимальных индексов)
Очень-очень много страниц, все эти планы выполнения мы неоднократно обсуждали.
Читать, думаю, тяжело.

Предлагаю поверить мне на слово :)
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474679
kiruha проходящий.
Какую эту? Что такое драйвер SqlLite? К чему он подключается? На чем основано утверждение, что "эту работу производит"?

В принципе это к проблеме мало имеет отношения, но если интересно
(SqlLite по русски)
внешняя компонента для 1С позволяющая подключать SqlLite
Тесты(в том числе планы запроса по подбору оптимальных индексов)
Очень-очень много страниц, все эти планы выполнения мы неоднократно обсуждали.
Читать, думаю, тяжело.

Предлагаю поверить мне на слово :)
Увы, но ничего позволяющего поверить на слово пока не вижу.
Мы здесь сравниваем разные движки обработки данных? Их оптимизаторы?
Или ты хочешь написать свой оптимизатор?
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474735
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по ссылке, автор (или авторы) SQLLite как раз и взял на себя труд "на лету" изменить условие выборки, чтобы оно использовало существующие индексные теги. Вот и используйте данный инструмент. Какие проблемы-то? Он, вроде бы бесплатный.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474828
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМСудя по ссылке, автор (или авторы) SQLLite как раз и взял на себя труд "на лету" изменить условие выборки, чтобы оно использовало существующие индексные теги. Вот и используйте данный инструмент. Какие проблемы-то? Он, вроде бы бесплатный.

Не вижу ничего простого.
Подскажите если можете.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474835
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий.
Увы, но ничего позволяющего поверить на слово пока не вижу.
Мы здесь сравниваем разные движки обработки данных? Их оптимизаторы?
Или ты хочешь написать свой оптимизатор?

В ссылке есть примеры запросов и планы выпонения с подбором индексов.
Честно говоря, совсем не хотел бы здесь сравнивать движки и тем более sqlLite.

Видимо оптимизатор запросов для Fox никто не писал - собственно это и хотел узнать.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474856
kiruhaВидимо оптимизатор запросов для Fox никто не писал - собственно это и хотел узнать.
Да я за много лет не видел ни одного оптимизатора запросов . Но во всех движках БД есть оптимизаторы исполнения запросов . И подбором индексов, при этом, кстати, автоматически, занимаются именно вторые. А вот первое - это чисто работа программиста, особенно если у него нет возможности изменить имеющиеся индексы. И это всего лишь подстраивание запроса под имеющиеся индексы. И насколько можно эту работу автоматизировать - очень большой вопрос.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474900
kiruha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проходящий. kiruhaВидимо оптимизатор запросов для Fox никто не писал - собственно это и хотел узнать.
Да я за много лет не видел ни одного оптимизатора запросов . Но во всех движках БД есть оптимизаторы исполнения запросов . И подбором индексов, при этом, кстати, автоматически, занимаются именно вторые. А вот первое - это чисто работа программиста, особенно если у него нет возможности изменить имеющиеся индексы. И это всего лишь подстраивание запроса под имеющиеся индексы. И насколько можно эту работу автоматизировать - очень большой вопрос.

Тогда перефразирую -
Есть ли способ заставить оптимизатор исполнения запросов в движке FoxPro , автоматически заняться подбором индексов ?
В случае когда есть возможность использовать индекс, но нет полного совпадения в условии с индексным выражением?
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35474989
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kiruhaТогда перефразирую -
Есть ли способ заставить оптимизатор исполнения запросов в движке FoxPro , автоматически заняться подбором индексов ?
В случае когда есть возможность использовать индекс, но нет полного совпадения в условии с индексным выражением?
Хм, как уже было сказано, оптимизатор в любом движке именно этим и занимается. Атоматически. Другое дело, что искусственный интеллект еще не изобрели и ни один известный мне оптимизатор не поймет, что выражение ctod(dtoc(fdate)) эквивалентно FDATE И можно взять индекс по этому полю. И уж тем более не будет составлять из полей выражения.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479067
karat4
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тут возникает вопрос, а нужно ли подклюяаться к БД 1С? Задача 1С самодостаточна и многофункциональна. Нет смысла лазить по базам. Другой вопрос это быстродействие - доступ к данным. Только для этого? Но FoxPro несравним по быстродействию и оптимизация здесь не уместна. БД до 100 000 записей в формате DBF не требуют оптимизации запросов. Не видел БД на 1С в DBF формате с таким количеством записей например в справочниках. 1С их просто не потянет на файлсервере.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479085
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
karat4Но FoxPro несравним по быстродействию и оптимизация здесь не уместна.
Ну-ну. На чем основано такое предположение? Из твоих рассуждений следует что фокс быстрее записи перебирает чем 1С? Это возможно только если фокс знает как быстрее с диска данные читать :)

Возьми какую-нибудь базу с табличками по 10-100 тыс.записей, и позапускай запросы сначала как есть, а потом удали индексы и повтори.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479124
Dima Tфокс быстрее записи перебирает чем 1С?
Кстати, да, быстрее. Движок 1С в этом деле слабоват.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479154
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий. Dima Tфокс быстрее записи перебирает чем 1С?
Кстати, да, быстрее. Движок 1С в этом деле слабоват.
Возможно. С 1С почти не связывался. Но думаю скорость перебора не намного отличается. Основным тормозом все-таки чтение из файла является, а при наличии правильного индекса фокс читает не все, а только нужные записи. Изучал как-то filemon`ом как фокс при наличии индексов выборки делает.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479181
Dima TВозможно. С 1С почти не связывался. Но думаю скорость перебора не намного отличается. Основным тормозом все-таки чтение из файла является, а при наличии правильного индекса фокс читает не все, а только нужные записи. Изучал как-то filemon`ом как фокс при наличии индексов выборки делает.
Вот как раз у 1С основным тормозом является ее движок, а не чтение данных с диска. Потому то фокс и быстрее.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479203
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий.Вот как раз у 1С основным тормозом является ее движок, а не чтение данных с диска. Потому то фокс и быстрее.
Абсолютно согласен. Я бы сказал что движка там почти нет и большинство выборок делается переборами в цикле.

Мы немного о разном говорим, выше я говорил о равной (пусть почти равной) производительности фокса и 1С при переборе записей ОДНОЙ таблицы. Тут никак в разы выигрыш не получить. Но стоит только появится задаче выборки из двух-трех таблицам как скорость выборки средствами 1С увеличится в разы по сравнению с фоксом.

В 1С8 вроде что-то получше сделали с движком, но функционал конфигураций раздули при этом, вобщем доделывать 1С-у еще очень много чего надо.
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479212
Dima Tскорость выборки средствами 1С увеличится в разы по сравнению с фоксом.
Увеличится скорость или таки время выборки?
...
Рейтинг: 0 / 0
Автоподбор индекса в запросах
    #35479227
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
проходящий. Dima Tскорость выборки средствами 1С увеличится в разы по сравнению с фоксом.
Увеличится скорость или таки время выборки?

Время конечно. Напутал немного. Хотел сказать "1С будет в разы дольше делать выборку".
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Автоподбор индекса в запросах
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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