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

Спасибо!
...
Рейтинг: 0 / 0
23.01.2008, 11:05
    #35080888
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
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
23.01.2008, 18:31
    #35083027
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
Опять же про Рашмора. Вы как раз должны отключить индекс, который помогает оптимизировать Ваше условие и тогда в SCAN можно задать условие FOR и будет работать быстро.
Если подходящего индекса нет и Вы не хотите его создавать - пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас и максимально оптимизирует запрос.
...
Рейтинг: 0 / 0
23.01.2008, 19:02
    #35083102
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
apapacyОпять же про Рашмора. Вы как раз должны отключить индекс, который помогает оптимизировать Ваше условие и тогда в SCAN можно задать условие FOR и будет работать быстро.
Если подходящего индекса нет и Вы не хотите его создавать - пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас и максимально оптимизирует запрос.
Зачем пытаться заставить работать оптимизатор косвенными методами когда есть простой способ явно написать оптимальный код?
SCAN WHILE ... начнет с текущей записи и остановится на первой не удовлетворяющей условию. Те будет прочитано на одну запись больше чем требует выборка.
Если использован SET KEY - значит индекс по нужному полю есть и включен.
SELECT в данном случае вероятно быстрее всего отработает если таблица открыта не монопольно. Но если требуется изменение исходной таблицы, то SELECT отпадает.
...
Рейтинг: 0 / 0
23.01.2008, 20:59
    #35083286
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
автор
Вы не хотите его создавать - пользуйтесь операторами SELECT-SQL и FoxPro создаст временные индексы за Вас и максимально оптимизирует запрос.



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

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

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

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
23.01.2008, 21:25
    #35083326
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
Но вы не комплексуйте, прошелмимо. Я б сам этого не знал, если бы в FoxPro/Lan2.0(DOS) документации этому не было посвящено не один абзац, а парочка глав.
...
Рейтинг: 0 / 0
23.01.2008, 22:30
    #35083390
lo-pata
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
И дополню вышеответивших авторов:
в случае применения scan for - отключайте индекс, тогда будет работать оптимизация.
комбинация set index + seek+scan while - даст не меньшую скорость.
...
Рейтинг: 0 / 0
24.01.2008, 08:57
    #35083681
anelsasha
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
stivap
... и все-таки, возвращаясь к первому сообщению в теме... автор неправ.... у него просто что-то не так.... фрагмента текста не мешало бы приложить... SET KEY TO + SCAN все должно отлично работать!!
...
Рейтинг: 0 / 0
24.01.2008, 09:35
    #35083741
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
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
24.01.2008, 10:01
    #35083813
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
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
24.01.2008, 19:15
    #35086144
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
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
24.01.2008, 20:03
    #35086222
apapacy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
Если бы Вы внимательнее читали 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
24.01.2008, 20:29
    #35086247
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SET KEY и SCAN
ну что в лоб, что по-лбу

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

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

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


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

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

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

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

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

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

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

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

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

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


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

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

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


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


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

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

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

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

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

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

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


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