|
|
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
делаю запрос к 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 10:02 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
в файле cdx два следующих индекса 1 НазваниеИндекса ACC1 Выражение DTOS(DATE)+SP22893+KIND+ACCID+SC0+SC1+SC2+SC3+SC4+CURRID Фильтр .NOT.DELETED() 2 НазваниеИндекса IDELETED Выражение "D" Фильтр DELETED() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 10:03 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
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' ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 11:30 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Вообще ничего не выдал по условию 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 11:35 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Ну, я там некорректно расставил константы. У тебя между (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 может выполнять операции поиска по неполному совпадению ключа. Т.е. по первым символам. Такие операции также оптимизируются, но в этом случае надо изменить выражение индекса, т.е. переиндексировать таблицу ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 11:53 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
не выбирает данные и с таким запросом, причем тоже долго думает. 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 11:56 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
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. Таким условиям хотя бы одна запись соответствует? Для FoxPro символ равенства и тождественного равенства (два знака равенства подряд) - не одно и то же. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:04 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
не выбирает и в таком случае 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 где-то есть описание как условие на индексы правильно написать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:04 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
методы 1С работают в таком случае: ДБОстДС.ТекущийИндекс("ACC1"); ДБОстДС.Ключ.DATE= '01.07.06'; ДБОстДС.Ключ.ACCID = " HQ"; ДБОстДС.Ключ.SP22893 = " 25OF"; ДБОстДС.Ключ.kind= "4"; ДБОстДС.Ключ.CURRID = " 3"; почему в ado не срабатывает - непонятно. видмо дело с пустыми полями SC0... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:06 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Приведите длину символьных выражений к длине символьных полей. Т.е. если поле SP22893 это Character(10), то символьная константа должна иметь 10 символов. Дополнить пробелами в конце. Для поиска через AND это не имеет значения, поскольку поиск выполняется по первым символам, но при включении этой константы в выражение, количество концевых пробелов (общая длина) приобретает принципиальное значение. Сравните: Код: plaintext 1. 2. 3. 4. Очевидно, что без добавления концевых пробелов сложение символьных строк будет работать некорректно. Для добавления концевых пробелов можно использовать функцию PADR() Код: plaintext PS: Не надо приводить методы 1С. Они мне ни о чем не говорят. Т.е. приблизительно логику понять могу, но в данном случае необходимо знать точную технологию работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:12 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
а какие-то методы выборки в данных файлах используя индексирования есть? ведь 1С как-то работает с этими индексными файлами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:12 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Владимир, конечно спасибо, но для тупых адынэснегов очень умно :) текст запроса можете написать? SC0 Character 13 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:16 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Написать-то можно, только на скорость выборки это никак не повлияет Код: plaintext 1. 2. Вместо вопросительных знаков поставьте нужную размерность соответсвующих полей. Если предполагается, что надо найти записи для которых поля SC0+SC1+SC2+SC3+SC4 пустые, то можно так Код: plaintext 1. 2. 3. 4. Проблема в том, что индексы имеют фильтры. Это уже никак не обойти. Оптимизация невозможна в принципе. Если только не строить индексы самостоятельно. Как эти индексы использует 1С вопрос к разработчикам 1С. Им виднее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:40 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Код: plaintext 1. 2. Для простоты и гибкости (вместо ??) рекомендуется что-то навроде: Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:46 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Кроме "реляционнной" команды Select-SQL в FoxPro существуют еще и "навигационные" команды, которые могут использовать любые индексы. Приведенный индекс командой Select-SQL не будет использоваться ни при каких условиях, о чем дважды (уже трижды) писал ВладимирМ. Вам нужно будет либо завести дополнительные индексы, удовлетворяющие требованиям Rushmore , либо использовать "навигационные" команды Set Order, Set Key, Seek, Scan. Первый вариант, с заведением индексов, наверное предпочтительнее. Создайте пять простых индексов по каждому полю, как писал ВладимирМ в своем первом посте, и работайте с привычным Select-SQL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:47 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
это таблицы 1С, так что создание дополнительных индексов абсолютно исключено. а можете дать пример работы с seek? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 12:58 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
точно что-то с индексом в dbf. Перевел базу 1С на sql - тот же запрос просто летает, доли секунды против 5-7 секунд на dbf. Значит индекс в самом деле сам должен подхватываться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 14:27 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Работа с Seek - это не для "тупых адынэснегов" (с) Это ж документацию читать придется... Создание дополнительного индекса точно ничем не повредит. Дай команды: Код: plaintext 1. 2. По идее, 1С должен будет автоматически поддерживать актуальность этих индексов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 14:35 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
1С поддерживает в бух. итогах только свои индексы. Дополнить индексы новыми невозможно. Странно, но как-то же берет 1С данные, причем шустро берет. Не думаю что они писали свои компоненты для доступа к dbf-файлам. А на sql да, шустро работает. И селект сам индексы подхватывает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 16:35 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
1С бух итоги1С поддерживает в бух. итогах только свои индексы. Дополнить индексы новыми невозможно.Ты проверял? Создавал индексы? И что происходило, 1С переставала работать? Или после изменения данных через 1С актуальность новых индексов не поддерживалась? 1С бух итогиСтранно, но как-то же берет 1С данные, причем шустро берет.Ну так "навигационный" подход рулит... И работает быстрее реляционного... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 17:08 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Вы удивитесь, но в 1С нельзя создать индексы. 1С сама их создает, сама решает какие. Можно конечно задать для поля индексирование, но создать индексный файл с автоматическим поддержанием его в актуальном состоянии нельзя. Спроси у своих знакомых одинэсников, насколько часто им приходится работать с индексными файлами. Ответ будет приблизительно следующий - никогда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 17:28 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
Мы не удивимся. Мы предлагаем в имеющемся индесном файле создать еще индексы. Естественно, не средствами 1С. А вот 1С и будет их поддерживать в актуальном состоянии. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.07.2006, 17:38 |
|
||
|
подключение индекса в VFPOLEDB
|
|||
|---|---|---|---|
|
#18+
С какого перепугу 1С будет их поддерживать в актуальном состоянии? Вы с 1С работали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.07.2006, 14:05 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33881784&tid=1591108]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
159ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
79ms |
get tp. blocked users: |
1ms |
| others: | 215ms |
| total: | 492ms |

| 0 / 0 |
