|
|
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Выполняю запрос из внешней программы к файлам dbf, через vfpoledb 9.0 провайдер. Записей в таблице много, около 500000, запрос выполняеться достаточно долго. Сделал запрос к дбф-у без индексного файла время что с индексом что без него одинаковое. Может кто-нибудь сталкивался с подобным ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 19:16:15 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Запрос какой и какие индексы есть? Структурные ли они? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 19:22:51 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Запрос простенький select accdtid,accktid from 1sentry where docid = ' 31P4 ' индексы стркутрные индексируемые поля docid, number number в запросе не используется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 19:28:35 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Переделай выражение индекса на, например INDEX ON PADR(docid,100) TAG docid тогда в выраджении WHERE PADR(docid) = ' 31P4 ' и посмотри http://www.foxclub.ru/articles/index.php?id=35 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 19:40:23 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Ошибочка-поправочка WHERE PADR(docid) = PADR('31P4',100) , те выражение слева и справо д.б. одинаковыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 19:42:18 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Беда в том что индексный файл используеться другой программой соответсвенно он должен оставаться таким каким он есть. Если файл поменять то программа не сможет с ним работать. Может есть в Foxpro какая нибудь команда или расширение указывающая что в SQL запросе должен использоваться определенный индекс. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 19:48:42 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Тогда создай свой (дополнительный) индекс, таким образом оптимизатор будет его подцеплять для выборки ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 20:02:27 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Нет. Индекс по PADR() здесь вообще не при чем. В какой кодовой странице созданы DBF-таблицы? Можно проверить в среде FoxPro командой ?CPDBF() В какой сортировке создан индекс по полю docid? Имеется в виду SET COLLATE. Можно проверить командой ?IDXCOLLATE() Если что-то из этих настроек отлично от текущей настройки среды, то индекс использовать НЕ будет. Впрочем, это все относилось к самой среде FoxPro. Как оно будет при работе через OLE я не в курсе. Никогда не работал. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 20:50:48 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
Как правильно указал Владимир - в VFP 9.0 отключается автоматически оптимизация запроса, если кодовые страницы индексов и кажется (?) среды не совпадают... Лечение - пересоздание всего в версии 9.0 с правильной кодовой страницей (или возврат на 8.0)... Тему эту мы где-то уже подробно обсуждали - воспользуйтесь поиском... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2005, 22:51:31 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
ВладимирМ Обращаю внимание на выражение которое ищется docid = ' 31P4 ' те = апостроф - пробел - 31P4 - пробел - апостроф, если это только не сделано для читабельности текста, а как в табличку записываются данные мы не знаем, то и кодовая страница не сильно поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2005, 12:22:10 |
|
||
|
Как заставить select использовать индексы
|
|||
|---|---|---|---|
|
#18+
PaulWist Я специально разбирался со способом сравнения символьных строк в команде Select-SQL. Т.е. это настройка SET ANSI Так вот. Есть 2 варианта сравнения: 1. SET ANSI OFF (или оператор тождественного равенства) - мЕньшее (по количеству символов) выражение дополняется пробелами до тех пор, пока не сравняется по длине с бОльшим docid = ' 31P4 ' Предположим, что docid - это C(100), значит ' 31P4 ' автоматически будет дополнено пробелами справа до 100 символов. По сути - получим то же самое PADR(), но в не явном виде docid = PADR(' 31P4 ',100) 2. SET ANSI ON - бОльшее выражение будет обрезано справа (отброшена концевая часть) с тем, чтобы уравняться по длине с мЕньшим выражением docid = ' 31P4 ' Предположим, что docid - это C(100), а ' 31P4 ' - это 6 символов. Значит, автоматически будет обрезано значение поля docid до тех же 6 символов. По сути - получим LEFT(docid,6), но в неявном виде LEFT(docid,6) = ' 31P4 ' Т.е. вне зависимости от текущей настройки SET ANSI будет сравнение на тот факт, что первыми символами в поле docid является указанная комбинация символов ' 31P4 '. А настройка SET ANSI уточняет - будут ли найденные записи оканчиваться только пробелами или кроме пробелов на конце могут быть и другие символы. Это все замечательно, но в данном случае вопрос был связан вовсе не со способом сравнения символьных строк, а с фактом использования или НЕ использования индекса по полю docid. Т.е. к основному вопросу все это отношения не имеет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2005, 14:44:05 |
|
||
|
|

start [/forum/topic.php?fid=41&gotonew=1&tid=1593704]: |
0ms |
get settings: |
6ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
439ms |
get topic data: |
10ms |
get first new msg: |
6ms |
get forum data: |
3ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 738ms |

| 0 / 0 |
