powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация Select
17 сообщений из 17, страница 1 из 1
Оптимизация Select
    #33937096
MrSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В VFP6 надо SEEK заменить на SELECT, т.е. выбрать первую попавшуюся запись, в которой значение поля соответствует выражению (не строго, EXACT OFF для SEEK). Структурный индекс по этому полю, естественно, существует.

SELECT tname.fname DISTINCT FROM tname WHERE tname.fname='123456' ORDER BY tname.fname TOP 1
- выполняется моментально

SELECT tname.fname DISTINCT FROM tname WHERE tname.fname='1' ORDER BY tname.fname TOP 1
- выполняется очень долго

Можно как-то по-другому написать SELECT, чтобы он выполнялся быстро независимо от длины выражения поиска?
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937380
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Если надо выбрать одну запись, то достаточно TOP 1, DISTINCT можно убрать
2. Включите показ плана выполнения запроса SYS(3054,1) и посмотрите степень оптимизации Rushmore. Желательно получить Full.
С уважением, Алексей
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937561
MrSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
по п.1: если убрать TOP 1 - выдается не одна запись, а все записи с минимальным значением fname, удовлетворяющим выражению.
по п.2: собственно и прошу совета как добится full оптимизации в простейшем примере, когда нужна выборка по единственному полю.
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937567
MrSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извиняюсь, убрать DISTINCT, а не TOP 1
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937590
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У вас VFP 6.0, тогда может быть. В старых версиях TOP n работало не совсем так, как положено.
Какой текст вам выдает VFP после SYS(3054,1) и вашего запроса?

С уважением, Алексей
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937656
MrSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Using index tag ... to rushmore optimize table ...
Rushmore optimization level for table ...: partial
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937717
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуйте перед запросом SET ORDER TO

С уважением, Алексей
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937787
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KПопробуйте перед запросом SET ORDER TO


Нет, не поможет для Select-a фокс переоткрывает таблицу в другой области.
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937792
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еси автор бы привел тестовый пример, тогда можно было бы что-то определенное сказать.
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937794
MrSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
То же самое
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937807
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist Aleksey-KПопробуйте перед запросом SET ORDER TO


Нет, не поможет для Select-a фокс переоткрывает таблицу в другой области.
А если уже открыта?
С уважением, Алексей.
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937851
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K PaulWist Aleksey-KПопробуйте перед запросом SET ORDER TO


Нет, не поможет для Select-a фокс переоткрывает таблицу в другой области.
А если уже открыта?
С уважением, Алексей.

Это не зависимо от того открыта или нет, всё равно открывает в др области , кстати с этим связана опция NOFILTER или READWRITE, если их не использовать , то при каких-то условиях (если его оптимизатор считает, что быстрее наложить фильтр, а не переливать во временный курсор) фокс просто накладывает фильтр на переоткрытую таблицу.
...
Рейтинг: 0 / 0
Оптимизация Select
    #33937947
MrSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
PaulWistЕси автор бы привел тестовый пример, тогда можно было бы что-то определенное сказать.

Я привел пример в первом сообщении. Подойдет любая таблица с индексированным символьным полем, и более или менее приличным количеством записей (заметно на 50тыс., на 3млн. - совсем беда).
Может кто-нибудь попробует в 8-ке или 9-ке? То же самое будет или нормально?
...
Рейтинг: 0 / 0
Оптимизация Select
    #33938015
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что вы хотите получить на tname.fname='1' ?
Только те записи, у которых которых tname.fname='1' или которые начинаются с '1'?
Дело в том, что выбираются все записи, а вам предъявляется столько, сколько хотите.
Если убрать TOP n и DISTINCT сколько записей возвращаются в обоих запросах?

С уважением, Алексей
...
Рейтинг: 0 / 0
Оптимизация Select
    #33938051
S866
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рискну предположить что длина вашего поля fname - 6 символов

поэтому и SELECT tname.fname DISTINCT FROM tname WHERE tname.fname='123456' ORDER BY tname.fname TOP 1
- выполняется моментально и оптимизация наверно Full - т.к. используется индекс по этому полю

SELECT tname.fname DISTINCT FROM tname WHERE tname.fname='1' ORDER BY tname.fname TOP 1 - выполняется очень долго т.к. длина заданой строки '1' - 1-н символ соответственно индекс по полю в 6 символов неиспользуется поэтому и partial.

Думайте над созданием необходимых индексов для таблицы.
...
Рейтинг: 0 / 0
Оптимизация Select
    #33938075
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MrSmith PaulWistЕси автор бы привел тестовый пример, тогда можно было бы что-то определенное сказать.

Я привел пример в первом сообщении. Подойдет любая таблица с индексированным символьным полем, и более или менее приличным количеством записей (заметно на 50тыс., на 3млн. - совсем беда).
Может кто-нибудь попробует в 8-ке или 9-ке? То же самое будет или нормально?

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

Вот в 9-ке

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
CREATE CURSOR test (f1 c( 10 ))
SELECT test 
INDEX ON f1 TAG f1

INSERT INTO test (f1) VALUES ('123456')
INSERT INTO test (f1) VALUES ('1')

SYS( 3054 , 1 )

SET DELETED ON 
SELECT * FROM test WHERE f1 = '123456' INTO CURSOR t

SET DELETED OFF 
SELECT * FROM test WHERE f1 = '123456' INTO CURSOR t

SET DELETED ON 
SELECT * FROM test WHERE f1 = '1' INTO CURSOR t

SET DELETED OFF 
SELECT * FROM test WHERE f1 = '1' INTO CURSOR t
...
Рейтинг: 0 / 0
Оптимизация Select
    #33938666
MrSmith
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я хочу получить первую попавшуюся запись, удовлетворяющую условию, и только одну. В принципе все получается. Вопрос в следующем:

SET EXACT OFF
IF SEEK('1','test','f1')
COPY TO ARRAY ar1 NEXT 1
ENDIF

Такой код сработает мгновенно на таблице test любого размера с символьным полем f1 любой длины и одним индексом по этому полю.

SELECT * FROM test WHERE f1 = '1' ORDER BY f1 TOP 1 INTO ARRAY ar1

Этот код дает такой же результат, но в VFP6 работает очень долго на большой таблице. Интерес остался чисто спортивный: можно ли по-другому написать SELECT, чтобы Rushmore догадался, как получить результат мгновенно? И не стал ли Rushmore хитрее в более поздних версиях?
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация Select
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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