powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Rushmor в выражении WHERE SELECT-a
11 сообщений из 11, страница 1 из 1
Rushmor в выражении WHERE SELECT-a
    #33530708
f_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ситуация: имеется таблица из нескольких числовых столбцов, по ним индекса нет, но есть составной индекс вида STR(pole1)+STR(pole2)+...STR(pole_n).

после открытия таблицы используется составной индекс.
делается выборка по таблице с условием:
WHERE STR(pole1)+STR(pole1)==STR(m.a)+STR(m.b).
на выходе - выборка. однако оптимизатор пишет, что индексы не используются.

возможно ли вообще в такой ситуации использование оптимизатором индексов в select-е и каким образом можно построить соответствуюший запрос ?
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33530939
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
STR(pole1)+STR(pole2)+...STR(pole_n).

Для того что бы такой индекс работал надо в условии поставить всё то что перечислено в индексе, либо создать для выборки по двум полям

Код: plaintext
WHERE STR(pole1)+STR(pole1)==STR(m.a)+STR(m.b).

отдельный индекс

Код: plaintext
INDEX ON STR(pole1)+STR(pole1)
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33531393
f_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да уже пробовал по полному выражению условие - результат тот же: пишет, что не оптимизируется условие.
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33531491
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй тест

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE CURSOR test (pole1 i, pole2 i)
INDEX ON STR(pole1) + STR(pole2) TAG ind

INSERT INTO test (pole1, pole2) VALUES ( 1 ,  1 )
INSERT INTO test (pole1, pole2) VALUES ( 2 ,  2 )
INSERT INTO test (pole1, pole2) VALUES ( 1 ,  2 )

?SYS( 3054 , 11 )

SELECT * FROM test WHERE STR(pole1) + STR(pole2) == STR( 2 ) + STR( 2 )
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33531709
f_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
спасибо за тест ;-) , после перестройки индексов все работает(похоже какие-то проблемы были).

получается что значение индексного ключа с неким сложным выражением используется оптимизатором только целиком и без вариантов (т.е. нет вариантов использования подобного индекса как составного индекса (в традиционном понимании-{pol1,pole2,...})) ?
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33531738
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
f_userспасибо за тест ;-) , после перестройки индексов все работает(похоже какие-то проблемы были).

получается что значение индексного ключа с неким сложным выражением используется оптимизатором только целиком и без вариантов (т.е. нет вариантов использования подобного индекса как составного индекса (в традиционном понимании-{pol1,pole2,...})) ?

Правильно понимаешь.
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33531799
f_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вокруг, млин, одни грабли - не развернешся ... :-(
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33531880
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У кого-то в сигнатуре видел такое

автор- обходя разложенные грабли, ты теряешь драгоценный опыт :))
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33539241
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi f_user!

Два момента - в VFP9 без SP1 есть проблем с использованием STR() в
индексах - такие индексы не используются оптимизатором (в SP1 это
исправлено)
Ну и наконец самое важное - фокс вполне может использовать лишь небольшой
кусок из "длинного" текстового индекса - но лишь НАЧАЛЬНЫЙ его кусок, и лишь
при условии текущей установки SET ANSI OFF - при этом конечно писать слева
нужно полное условие индекса, а вот сравнивать вполне можно с более короткой
строкой (т.е. просто игнорировать "дальние" части составного индекса).
Ещё один хинт - используя BINTOC() можно весьма эффективно "упаковывать"
целые числа, при этом конечно можно "сцеплять" несколько полей как и для
STR() - это для больших таблиц даёт существенный выигрыш. Конечно есть и
опасность - при использовании COLLATE # MACHINE сравнение бинарных данных
будет некорректно.

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33539950
f_user
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
thanx за совет по поводу траблов в оптимизаторе.
по поводу "длинных" индексов: а собственно у таких индексов похоже нет отличий от обычных индексов по строковым полям. или не совсем так ?
...
Рейтинг: 0 / 0
Rushmor в выражении WHERE SELECT-a
    #33547858
Igor Korolyov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Hi f_user!

> по поводу "длинных" индексов: а собственно у таких индексов похоже нет
> отличий от обычных индексов по строковым полям. или не совсем так ?

Не уверен что понял тебя правильно...
Просто чем "длиннее" индексное выражение, тем больше (в общем случае)
индексный файл - значит медленнее будет работать (считай по сети 10Мб и
50Мб - есть же большая разница). Если есть возможность "урезать" размер
индекса не повлияв конечно на его функциональность - то стоит попробовать...

Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Rushmor в выражении WHERE SELECT-a
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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