Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация Select / 17 сообщений из 17, страница 1 из 1
23.08.2006, 12:18
    #33937096
MrSmith
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
В 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
23.08.2006, 13:19
    #33937380
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
1. Если надо выбрать одну запись, то достаточно TOP 1, DISTINCT можно убрать
2. Включите показ плана выполнения запроса SYS(3054,1) и посмотрите степень оптимизации Rushmore. Желательно получить Full.
С уважением, Алексей
...
Рейтинг: 0 / 0
23.08.2006, 14:07
    #33937561
MrSmith
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
по п.1: если убрать TOP 1 - выдается не одна запись, а все записи с минимальным значением fname, удовлетворяющим выражению.
по п.2: собственно и прошу совета как добится full оптимизации в простейшем примере, когда нужна выборка по единственному полю.
...
Рейтинг: 0 / 0
23.08.2006, 14:08
    #33937567
MrSmith
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
извиняюсь, убрать DISTINCT, а не TOP 1
...
Рейтинг: 0 / 0
23.08.2006, 14:15
    #33937590
Aleksey-K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
У вас VFP 6.0, тогда может быть. В старых версиях TOP n работало не совсем так, как положено.
Какой текст вам выдает VFP после SYS(3054,1) и вашего запроса?

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

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


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


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


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

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

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

С уважением, Алексей
...
Рейтинг: 0 / 0
23.08.2006, 15:55
    #33938051
S866
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
Рискну предположить что длина вашего поля 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
23.08.2006, 15:58
    #33938075
PaulWist
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
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
23.08.2006, 18:55
    #33938666
MrSmith
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизация Select
Я хочу получить первую попавшуюся запись, удовлетворяющую условию, и только одну. В принципе все получается. Вопрос в следующем:

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
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Оптимизация Select / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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