powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / подключение индекса в VFPOLEDB
25 сообщений из 25, страница 1 из 1
подключение индекса в VFPOLEDB
    #33881293
делаю запрос к dbf-файлу, объем файла 300 мб. Запрос работает слишком медленно, видимо не подхватывается индекс. Почему?
Текст Conn. String: Provider=VFPOLEDB.1;Deleted=Yes;Mode=ReadWrite;Extended Properties="";User ID="";Password="";Mask Password=False;Collating Sequence=RUSSIAN;DSN="";Data Source=D:\ado\
Текст запроса: select date,accid, kind, CURRID, SP22893, sum(cast(sd as double)) as n1 from 1SBKTTL.DBF where (date={^2006.07.01}) and (SP22893=' 25OF') and (kind='4') and (accid=' HQ') and (CURRID=' 3') GROUP BY date,accid,kind,SP22893,CURRID
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881297
в файле cdx два следующих индекса
1 НазваниеИндекса ACC1 Выражение DTOS(DATE)+SP22893+KIND+ACCID+SC0+SC1+SC2+SC3+SC4+CURRID Фильтр .NOT.DELETED()
2 НазваниеИндекса IDELETED Выражение "D" Фильтр DELETED()
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881509
up
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881595
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) Rushmore-оптимизация НЕ использует индексы, содержащие фильтры
2) Rushmore-оптимизация использует только те индексы, выражение которых ПОЛНОСТЬЮ совпадает с выражением, указанным в условии отбора.

Поскольку Ваш индекс имеет фильтр по NOT DELETED(), то этот индекс при оптимизации использовать вообще не будет ни при каких условиях.

Поскольку выражение индекса в принципе не совпадает с выражениями, использованными в директиве WHERE, то при оптимизации этот индекс использоваться не будет.

Чтобы оптимизировать выражение типа

where (date={^2006.07.01}) and (SP22893=' 25OF') and (kind='4') and (accid=' HQ') and (CURRID=' 3')

Нужно 5 отдельных индексов. По каждому полю в отдельности.

Если же хочется использовать индекс аналогичный приведенному, но без FOR-условия, то условие отбора должно ПОЛНОСТЬЮ совпадать с выражением индекса. Т.е. что-то вроде

WHERE DTOS(DATE)+SP22893+KIND+ACCID+SC0+SC1+SC2+SC3+SC4+CURRID = DTOS({^2006.07.01})+' 25OF'+'4'+' HQ'+' 3'
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881625
Вообще ничего не выдал по условию
WHERE DTOS(DATE)+SP22893+KIND+ACCID+SC0+SC1+SC2+SC3+SC4+CURRID = DTOS({^2006.07.01})+' 25OF'+'4'+' HQ'+' 3'
видимо надо включить в условие еще и значения полей SC0+SC1+SC2+SC3+SC4
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881703
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, я там некорректно расставил константы. У тебя между (accid=' HQ') and (CURRID=' 3') надо вставить еще значения полей SC0+SC1+SC2+SC3+SC4 или модифицировать условие так, чтобы "лишние" поля оказались в конце.

WHERE DTOS(DATE)+SP22893+KIND+ACCID+ CURRID +SC0+SC1+SC2+SC3+SC4 = DTOS({^2006.07.01})+' 25OF'+'4'+' HQ'+' 3'

FoxPro может выполнять операции поиска по неполному совпадению ключа. Т.е. по первым символам. Такие операции также оптимизируются, но в этом случае надо изменить выражение индекса, т.е. переиндексировать таблицу
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881711
не выбирает данные и с таким запросом, причем тоже долго думает.
select date,accid, kind, CURRID,SP22893,SC0,SC1,SC2,SC3,SC4, sum(cast(sd as double)) as n1 from where (DTOS(DATE)+SP22893+KIND+ACCID+SC0+SC1+SC2+SC3+SC4+CURRID = DTOS({^2006.07.01})+' 25OF'+'4'+' HQ'+''+''+''+''+' 3') GROUP BY date,accid,kind,SP22893,CURRID,SC0,SC1,SC2,SC3,SC4
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881749
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1С бух итогине выбирает данные и с таким запросом, причем тоже долго думает.
select date,accid, kind, CURRID,SP22893,SC0,SC1,SC2,SC3,SC4, sum(cast(sd as double)) as n1 from where (DTOS(DATE)+SP22893+KIND+ACCID+SC0+SC1+SC2+SC3+SC4+CURRID = DTOS({^2006.07.01})+' 25OF'+'4'+' HQ'+''+''+''+''+' 3') GROUP BY date,accid,kind,SP22893,CURRID,SC0,SC1,SC2,SC3,SC4
Я ведь и еще раз могу написать, то, что уже написал.

ВладимирМ1) Rushmore-оптимизация НЕ использует индексы, содержащие фильтры

Поскольку Ваш индекс имеет фильтр по NOT DELETED(), то этот индекс при оптимизации использовать вообще не будет ни при каких условиях.

А почему не выбирает данные, так это Вам виднее. У Вас поля SC0, SC1, ... имеют тип VarChar и при этом не заполнены? По сути, Вы написали такое условие:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
where 
	DTOS(DATE)=DTOS({^ 2006 . 07 . 01 })
	AND SP22893 = '    25OF'
	AND KIND = '4'
	AND ACCID = '     HQ'
	AND SC0 == ''
	AND SC1 == ''
	AND SC2 == ''
	AND SC3 == ''
	AND SC4 = а про это вообще ничего не написано
	AND CURRID = '     3'

Таким условиям хотя бы одна запись соответствует? Для FoxPro символ равенства и тождественного равенства (два знака равенства подряд) - не одно и то же.
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881751
не выбирает и в таком случае
select date,accid, kind, CURRID,SP22893,SC0,SC1,SC2,SC3,SC4, sum(cast(sd as double)) as n1 from where (DTOS(DATE)+SP22893+KIND+ACCID+CURRID+SC0+SC1+SC2+SC3+SC4 = DTOS({^2006.07.01})+' 25OF'+'4'+' HQ'+' 3') GROUP BY date,accid,kind,SP22893,CURRID,SC0,SC1,SC2,SC3,SC4
где-то есть описание как условие на индексы правильно написать?
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881763
методы 1С работают в таком случае:
ДБОстДС.ТекущийИндекс("ACC1");

ДБОстДС.Ключ.DATE= '01.07.06';
ДБОстДС.Ключ.ACCID = " HQ";
ДБОстДС.Ключ.SP22893 = " 25OF";
ДБОстДС.Ключ.kind= "4";
ДБОстДС.Ключ.CURRID = " 3";
почему в ado не срабатывает - непонятно. видмо дело с пустыми полями SC0...
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881784
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приведите длину символьных выражений к длине символьных полей.

Т.е. если поле SP22893 это Character(10), то символьная константа должна иметь 10 символов. Дополнить пробелами в конце.

Для поиска через AND это не имеет значения, поскольку поиск выполняется по первым символам, но при включении этой константы в выражение, количество концевых пробелов (общая длина) приобретает принципиальное значение.

Сравните:

Код: plaintext
1.
2.
3.
4.
?'123  ' = '123'
?'456  ' = '456'
?'123  '+'456  ' = '123456'
?'123  '+'456  ' = '123  456  '

Очевидно, что без добавления концевых пробелов сложение символьных строк будет работать некорректно.

Для добавления концевых пробелов можно использовать функцию PADR()

Код: plaintext
?PADR(' 25OF', 10 )

PS: Не надо приводить методы 1С. Они мне ни о чем не говорят. Т.е. приблизительно логику понять могу, но в данном случае необходимо знать точную технологию работы.
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881785
а какие-то методы выборки в данных файлах используя индексирования есть? ведь 1С как-то работает с этими индексными файлами
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881802
Владимир, конечно спасибо, но для тупых адынэснегов очень умно :)
текст запроса можете написать?
SC0 Character 13
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881904
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написать-то можно, только на скорость выборки это никак не повлияет

Код: plaintext
1.
2.
WHERE 
DTOS(DATE)+SP22893+KIND+ACCID+CURRID = 
DTOS({^ 2006 . 07 . 01 })+PADR(' 25OF',??)+PADR('4',??)+PADR(' HQ',??)+PADR(' 3',??)

Вместо вопросительных знаков поставьте нужную размерность соответсвующих полей.

Если предполагается, что надо найти записи для которых поля SC0+SC1+SC2+SC3+SC4 пустые, то можно так

Код: plaintext
1.
2.
3.
4.
WHERE 
DTOS(DATE)+SP22893+KIND+ACCID+SC0+SC1+SC2+SC3+SC4+CURRID = 
DTOS({^ 2006 . 07 . 01 })+PADR(' 25OF',??)+PADR('4',??)+PADR(' HQ',??)+
SPACE( 13 )+SPACE( 13 )+SPACE( 13 )+SPACE( 13 )+SPACE( 13 )+PADR(' 3',??)


Проблема в том, что индексы имеют фильтры. Это уже никак не обойти. Оптимизация невозможна в принципе. Если только не строить индексы самостоятельно.

Как эти индексы использует 1С вопрос к разработчикам 1С. Им виднее
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881933
Sergey Ch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМ
Код: plaintext
1.
2.
WHERE 
DTOS(DATE)+SP22893+KIND+ACCID+CURRID = 
DTOS({^ 2006 . 07 . 01 })+PADR(' 25OF',??)+PADR('4',??)+PADR(' HQ',??)+PADR(' 3',??)

Для простоты и гибкости (вместо ??) рекомендуется что-то навроде:
Код: plaintext
1.
DTOS(DATE)+SP22893+KIND+ACCID+CURRID = 
DTOS({^ 2006 . 07 . 01 })+PADR(' 25OF',len(SP22893))+PADR('4',len(KIND))+PADR(' HQ',len(ACCID))+PADR(' 3',len(CURRID ))
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881935
karly™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кроме "реляционнной" команды Select-SQL в FoxPro существуют еще и "навигационные" команды, которые могут использовать любые индексы.

Приведенный индекс командой Select-SQL не будет использоваться ни при каких условиях, о чем дважды (уже трижды) писал ВладимирМ.

Вам нужно будет либо завести дополнительные индексы, удовлетворяющие требованиям Rushmore , либо использовать "навигационные" команды Set Order, Set Key, Seek, Scan.

Первый вариант, с заведением индексов, наверное предпочтительнее.

Создайте пять простых индексов по каждому полю, как писал ВладимирМ в своем первом посте, и работайте с привычным Select-SQL
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33881974
это таблицы 1С, так что создание дополнительных индексов абсолютно исключено.
а можете дать пример работы с seek?
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33882334
точно что-то с индексом в dbf. Перевел базу 1С на sql - тот же запрос просто летает, доли секунды против 5-7 секунд на dbf. Значит индекс в самом деле сам должен подхватываться.
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33882362
karly™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работа с Seek - это не для "тупых адынэснегов" (с) Это ж документацию читать придется...

Создание дополнительного индекса точно ничем не повредит.

Дай команды:
Код: plaintext
1.
2.
Index on date tag mytag1
Index on SP22893 tag mytag2
...

По идее, 1С должен будет автоматически поддерживать актуальность этих индексов.
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33882797
1С поддерживает в бух. итогах только свои индексы. Дополнить индексы новыми невозможно. Странно, но как-то же берет 1С данные, причем шустро берет. Не думаю что они писали свои компоненты для доступа к dbf-файлам. А на sql да, шустро работает. И селект сам индексы подхватывает.
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33882921
karly™
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1С бух итоги1С поддерживает в бух. итогах только свои индексы. Дополнить индексы новыми невозможно.Ты проверял? Создавал индексы? И что происходило, 1С переставала работать? Или после изменения данных через 1С актуальность новых индексов не поддерживалась?

1С бух итогиСтранно, но как-то же берет 1С данные, причем шустро берет.Ну так "навигационный" подход рулит... И работает быстрее реляционного...
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33883016
Вы удивитесь, но в 1С нельзя создать индексы. 1С сама их создает, сама решает какие. Можно конечно задать для поля индексирование, но создать индексный файл с автоматическим поддержанием его в актуальном состоянии нельзя. Спроси у своих знакомых одинэсников, насколько часто им приходится работать с индексными файлами. Ответ будет приблизительно следующий - никогда.
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33883055
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы не удивимся. Мы предлагаем в имеющемся индесном файле создать еще индексы. Естественно, не средствами 1С. А вот 1С и будет их поддерживать в актуальном состоянии.
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33885236
С какого перепугу 1С будет их поддерживать в актуальном состоянии? Вы с 1С работали?
...
Рейтинг: 0 / 0
подключение индекса в VFPOLEDB
    #33885518
Проходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И не один год. Она их не сможет создать, но поддержать может.
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / подключение индекса в VFPOLEDB
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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