|
|
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
В 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, чтобы он выполнялся быстро независимо от длины выражения поиска? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 12:18 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
1. Если надо выбрать одну запись, то достаточно TOP 1, DISTINCT можно убрать 2. Включите показ плана выполнения запроса SYS(3054,1) и посмотрите степень оптимизации Rushmore. Желательно получить Full. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 13:19 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
по п.1: если убрать TOP 1 - выдается не одна запись, а все записи с минимальным значением fname, удовлетворяющим выражению. по п.2: собственно и прошу совета как добится full оптимизации в простейшем примере, когда нужна выборка по единственному полю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 14:07 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
извиняюсь, убрать DISTINCT, а не TOP 1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 14:08 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
У вас VFP 6.0, тогда может быть. В старых версиях TOP n работало не совсем так, как положено. Какой текст вам выдает VFP после SYS(3054,1) и вашего запроса? С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 14:15 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
Using index tag ... to rushmore optimize table ... Rushmore optimization level for table ...: partial ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 14:35 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
Попробуйте перед запросом SET ORDER TO С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 14:48 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
Aleksey-KПопробуйте перед запросом SET ORDER TO Нет, не поможет для Select-a фокс переоткрывает таблицу в другой области. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:00 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
Еси автор бы привел тестовый пример, тогда можно было бы что-то определенное сказать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:00 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
PaulWist Aleksey-KПопробуйте перед запросом SET ORDER TO Нет, не поможет для Select-a фокс переоткрывает таблицу в другой области. А если уже открыта? С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:04 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
Aleksey-K PaulWist Aleksey-KПопробуйте перед запросом SET ORDER TO Нет, не поможет для Select-a фокс переоткрывает таблицу в другой области. А если уже открыта? С уважением, Алексей. Это не зависимо от того открыта или нет, всё равно открывает в др области , кстати с этим связана опция NOFILTER или READWRITE, если их не использовать , то при каких-то условиях (если его оптимизатор считает, что быстрее наложить фильтр, а не переливать во временный курсор) фокс просто накладывает фильтр на переоткрытую таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:10 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
PaulWistЕси автор бы привел тестовый пример, тогда можно было бы что-то определенное сказать. Я привел пример в первом сообщении. Подойдет любая таблица с индексированным символьным полем, и более или менее приличным количеством записей (заметно на 50тыс., на 3млн. - совсем беда). Может кто-нибудь попробует в 8-ке или 9-ке? То же самое будет или нормально? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:32 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
А что вы хотите получить на tname.fname='1' ? Только те записи, у которых которых tname.fname='1' или которые начинаются с '1'? Дело в том, что выбираются все записи, а вам предъявляется столько, сколько хотите. Если убрать TOP n и DISTINCT сколько записей возвращаются в обоих запросах? С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:47 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
Рискну предположить что длина вашего поля 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. Думайте над созданием необходимых индексов для таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:55 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 15:58 |
|
||
|
Оптимизация Select
|
|||
|---|---|---|---|
|
#18+
Я хочу получить первую попавшуюся запись, удовлетворяющую условию, и только одну. В принципе все получается. Вопрос в следующем: 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 хитрее в более поздних версиях? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.08.2006, 18:55 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33937787&tid=1590913]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
169ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
32ms |
get tp. blocked users: |
1ms |
| others: | 253ms |
| total: | 490ms |

| 0 / 0 |
