powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SET KEY и SCAN
18 сообщений из 18, страница 1 из 1
SET KEY и SCAN
    #35080524
stivap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Установил выборку данных по SET KEY с условием. Затем делаю SCAN по выбранным записям, при этом происходит то, что SCAN осуществляется по всем записям таблицы а не по выбранным, что существенно замедляет работу. Можно ли решить эту проблему?

Спасибо!
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35080888
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET KEY для этого не нужен. Можно так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
lcVal = ...
set order to MyOrder in MyTable
if indexseek(lcVal, .T., 'MyTable', 'MyOrder')
    sele MyTable
    scan while cValField = lcVal
       ...
    endscan
endif
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083027
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Опять же про Рашмора. Вы как раз должны отключить индекс, который помогает оптимизировать Ваше условие и тогда в SCAN можно задать условие FOR и будет работать быстро.
Если подходящего индекса нет и Вы не хотите его создавать - пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас и максимально оптимизирует запрос.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083102
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacyОпять же про Рашмора. Вы как раз должны отключить индекс, который помогает оптимизировать Ваше условие и тогда в SCAN можно задать условие FOR и будет работать быстро.
Если подходящего индекса нет и Вы не хотите его создавать - пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас и максимально оптимизирует запрос.
Зачем пытаться заставить работать оптимизатор косвенными методами когда есть простой способ явно написать оптимальный код?
SCAN WHILE ... начнет с текущей записи и остановится на первой не удовлетворяющей условию. Те будет прочитано на одну запись больше чем требует выборка.
Если использован SET KEY - значит индекс по нужному полю есть и включен.
SELECT в данном случае вероятно быстрее всего отработает если таблица открыта не монопольно. Но если требуется изменение исходной таблицы, то SELECT отпадает.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083286
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Вы не хотите его создавать - пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас и максимально оптимизирует запрос.



что-то новое, из серии фантастики

советую автору, запостившему эту чушь, еще разок почитать на тему оптим-и запросов в фокспро

при вып-и запросов
фокс сам ничего не опт-ет, а включает опт-ю как раз при нал-и треб-х индексов и вып-и ряда условий
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083322
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прочитал и Вам рекомендую

Using Rushmore Query Optimization with Tables
Use Rushmore to optimize data access according to the number of tables involved. When you access single tables, you can take advantage of Rushmore anywhere that a FOR clause appears. When you access multiple tables, SELECT - SQL queries supersede all Rushmore optimizations. In an SQL command, Visual FoxPro decides what is needed to optimize a query and does the work for you. You don't need to open tables or indexes. If SQL decides it needs indexes, it creates temporary indexes for its own use
.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083326
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но вы не комплексуйте, прошелмимо. Я б сам этого не знал, если бы в FoxPro/Lan2.0(DOS) документации этому не было посвящено не один абзац, а парочка глав.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083390
lo-pata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И дополню вышеответивших авторов:
в случае применения scan for - отключайте индекс, тогда будет работать оптимизация.
комбинация set index + seek+scan while - даст не меньшую скорость.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083681
anelsasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
stivap
... и все-таки, возвращаясь к первому сообщению в теме... автор неправ.... у него просто что-то не так.... фрагмента текста не мешало бы приложить... SET KEY TO + SCAN все должно отлично работать!!
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083741
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2apapacy

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
create table t (id i autoinc, value c( 100 ))
local i
for i= 1  to  100 
	insert into t (value) values ("")
endfor

=SYS( 3054 , 11 ) 

?  1 
select * ;
	from t ; 
	into cursor t2 ;
	where id> 0 

use in select("t2")

select t
index on id tag id

?  2 
select * ;
	from t ; 
	into cursor t2 ;
	where id> 0 
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35083813
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2apapacy
автор
Но вы не комплексуйте


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SET OPTIMIZE ON
create table pp (id i, value1 c( 250 ), value2 c( 250 ))
local i, lnSeconds
for i= 1  to  1000000 
	insert into pp (id) values (i)
endfor

=SYS( 3054 , 11 ) 
lnSeconds = seconds()
?  1 
select * ;
	from pp ; 
	into cursor t2 ;
	where pp.id> 10  and pp.id< 100000 
? seconds() - lnSeconds

возможно натолкнет на мысль ...
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35086144
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacyПрочитал и Вам рекомендую

Using Rushmore Query Optimization with Tables
Use Rushmore to optimize data access according to the number of tables involved. When you access single tables, you can take advantage of Rushmore anywhere that a FOR clause appears. When you access multiple tables, SELECT - SQL queries supersede all Rushmore optimizations. In an SQL command, Visual FoxPro decides what is needed to optimize a query and does the work for you. You don't need to open tables or indexes. If SQL decides it needs indexes, it creates temporary indexes for its own use
.
(VFP9 Help)
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35086222
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если бы Вы внимательнее читали Help, то знали бы уже,что SYS(3054, 11)

Issue SYS(3054, 11) to display the Rushmore join optimization level after a query is executed. The optimization level is displayed in the active window

И где ж Ваш JOIN. А о том, что SELECT-SQL работает с оптимизацией я неоднократно убеждался при работе на 286 процессорах.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35086247
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну что в лоб, что по-лбу

выполните пример 2-мя постами выше

затем создайте индекс и снова выполните

посмотрите что изменилось
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35086304
apapacy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут уж прийдется цитировать себя, люибимого:


Я (только вчера)

Если подходящего индекса нет и Вы не хотите его создавать - пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас и максимально оптимизирует запрос.

Что непонятно Вам? Пишите.

Если подходящего индекса нет

и Вы не хотите его создавать

пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас

Тут все, надеюсь, понимают что с индексами будет быстрее. Но если индексов нет.

То оператор SCAN FOR / REPLACE FOR будет работать медленнее,чем SELECT WHERE / UPDATE WHERE.

Где я допустил неточность. Скажите.

Еще раз. Если нет подходящего индекса и Вы не хотите его создавать.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35086609
Galyamov Rinat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То оператор SCAN FOR / REPLACE FOR будет работать медленнее,чем
SELECT WHERE / UPDATE WHERE.


Я, честно говоря, спец. литру по этому вопросу не читал, но могу точно
сказать, что для построения индкса нужно считать значения полей, входящих в
индексное выражение. После пострить индекс и только потом уже выбирать по
индексу.

В случае со сканом просто считать значения полей, входящих в выражение
условия, и сразу применить или не применить необходимые действия.

Так что, ИМХО, если по условиям необходимо выполнить один прогон, то скан
будет быстрее. Если же по тем же условиям надо будет выполнить пакет
действий (грубо говоря сделать два и более прогонов по базе), то тогда,
возможно, есть смысл тратить время на неявное создание временных индексов и
, соответсвенно, использовать select, update...


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35086707
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторТут уж прийдется цитировать себя, люибимого:


Ваша манера общения напоминает спеца из КейСистемс.
Очень не хочется Вас провоцировать, т.к. Вас несет ...., но
Очень хочется процитировать Киркорова, но сдержусь.

Общаться с Вами мне очень неприятно.

Ваши советы из серии вредных:
1. неоптимальны
2. приводят к ошиб-м рез-там при опред.условиях.

Писать статью сюда я не буду, мне Вас переуб-ть не интересно.
Советую Вам еще раз прочитать рук-во по теме "Понимание..." наискосок.
Если Вы желаете доказать свою правоту, то пожалуйста продемонстрируйте
неск-ко примеров (код фокспро) ...
Словесного поноса больше не нужно.
...
Рейтинг: 0 / 0
SET KEY и SCAN
    #35089809
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
apapacyГде я допустил неточность. Скажите.
Я объясню за Александра. Хорошо?

Да, FoxPro может создать временные индексы. Но Вы пропустили ключевое слово - если необходимо . Т.е. может создать, но может и НЕ создать. В зависимости от запроса.

Как правило, необходимость во временных индексах возникает в сложных коррелированных запросах. Когда уже из синтаксиса запроса ясно, что придется многократно выполнять сканирование одних и тех же данных. Т.е. временный индекс создается тогда, когда из анализа запроса следует, что время, потраченное на его построение будет меньше, чем многократное сканирование без него.

Но это лишь мое предположение. Функция SYS(3054) явно укажет был создан временный индекс или нет. На простых запросах, как в данном случае, временные индексы не создаются.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / SET KEY и SCAN
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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