powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / оптимизация delete sql
20 сообщений из 20, страница 1 из 1
оптимизация delete sql
    #36874469
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
возьмем пример из хелпа и немножко подправим
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CLOSE DATABASES ALL 
clear
CREATE CURSOR MyProducts (ProdID I , OurPrice Y NULL)
INDEX on ProdID tag ProdID
INSERT INTO MyProducts VALUES ( 1 , 1 . 10 ) && matches but is not marked for deletion
INSERT INTO MyProducts VALUES ( 2 , 2 . 20 ) && matches and is marked
INSERT INTO MyProducts VALUES ( 3 , 3 . 30 ) && matches and is marked

CREATE CURSOR MSRPList (ProdID I , ProdCategory I Null, MSRP Y, Discontinued L) 
INDEX on ProdID tag ProdID
INSERT INTO MSRPList VALUES ( 1 ,  9 ,  1 . 00 , .f.) 
INSERT INTO MSRPList VALUES ( 2 ,  8 ,  2 . 00 , .t.) 
INSERT INTO MSRPList VALUES ( 3 ,  7 ,  3 . 00 , .t.) 
SYS( 3054 , 12 )
DELETE  MyProducts FROM force MSRPList ;
   WHERE MSRPList.ProdID = MyProducts.ProdID;
      AND MSRPList.discontinued = .t.
и увидим что оптимизация не включилась
и дейсвительно использование такой же команды на большой таблице "вызывает тормоза"
вопрос:
delete sql в принципе не оптимизируется или всетаки можно что-то сделать?
тогда что можно сделать?
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874484
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ой
в строке DELETE слово force лишнее
что с ним что без него план оптимизации не меняется
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874493
АлексейО,
а при чем тут delete? Дело не в нем, ав отсутствии нужных индексов. Которые нужны не только для delete.
Создайте примерно такой дополнительный индекс
Код: plaintext
Index on Discontinued tag Discont binary
и сравните.
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874510
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я поступил так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CLOSE DATABASES ALL 
clear
CREATE CURSOR MyProducts (ProdID I , OurPrice Y NULL)
INDEX on ProdID tag ProdID
INSERT INTO MyProducts VALUES ( 1 , 1 . 10 ) && matches but is not marked for deletion
INSERT INTO MyProducts VALUES ( 2 , 2 . 20 ) && matches and is marked
INSERT INTO MyProducts VALUES ( 3 , 3 . 30 ) && matches and is marked

CREATE CURSOR MSRPList (ProdID I , ProdCategory I Null, MSRP Y, Discontinued L) 
INDEX on ProdID tag ProdID
INSERT INTO MSRPList VALUES ( 1 ,  9 ,  1 . 00 , .f.) 
INSERT INTO MSRPList VALUES ( 2 ,  8 ,  2 . 00 , .t.) 
INSERT INTO MSRPList VALUES ( 3 ,  7 ,  3 . 00 , .t.) 
SYS( 3054 , 12 )
DELETE  MyProducts FROM force MSRPList ;
   WHERE MSRPList.ProdID = MyProducts.ProdID
результат:
Rushmore optimization level for intermediate result: none
Rushmore optimization level for table myproducts: none
Joining table myproducts and intermediate result using index tag Prodid
и прежние тормоза на больших таблицах
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874525
АлексейО,
Вы мое сообщение читали? А выполнить предложенное пробовали?
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874598
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ну да прикольно:
картинка изменилась:

DELETE MyProducts FROM MSRPList WHERE MSRPList.ProdID = MyProducts.ProdID AND MSRPList.discontinued = .t.
Using index tag Disc to rushmore optimize intermediate result
Rushmore optimization level for intermediate result: partial
Rushmore optimization level for table myproducts: none
Joining table myproducts and intermediate result using index tag Prodid

появилось какаято оптимазация промежуточного результата
но она мне не особо нужна, мне нужна оптимизация самого delete
поэтому подскажите пожалуйста как оптимизировать DELETE MyProducts FROM MSRPList WHERE MSRPList.ProdID = MyProducts.ProdID
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874611
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так понимаю фокс делает полный скан по MyProducts проверяя наличие MSRPList.ProdID по индексу MSRPList.ProdID. Отсюда и тормоза при большой таблице MyProducts.

Если MSRPList небольшая таблица, то можно примерно так:
Код: plaintext
1.
2.
3.
4.
5.
6.
set order to ProdID in MyProducts
sele MSRPList
scan
     if indexseek(MSRPList.ProdID, .T., 'MyProducts', 'ProdID')
         delete in MyProducts while MyProducts.ProdID = MSRPList.ProdID
     endif
endscan
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874619
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейОDELETE MyProducts FROM MSRPList WHERE MSRPList.ProdID = MyProducts.ProdID AND MSRPList.discontinued = .t.
...

DELETE MyProducts FROM MSRPList WHERE MSRPList.ProdID = MyProducts.ProdID

Не понял: MSRPList.discontinued = .t. оно надо или нет?
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874628
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TЯ так понимаю фокс делает полный скан по MyProducts проверяя наличие MSRPList.ProdID по индексу MSRPList.ProdID. Отсюда и тормоза при большой таблице MyProducts.
ну я тоже так понимаюDima T
Если MSRPList небольшая таблица
мой аналог MyProducts довольно большая таблица и полный скан да по сети это несколько минут - неустраивает
т.е. вы считаете что delete sql неоптимизируется в принципе?
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874641
piva
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выражение в WHERE местами поменять не пробовали ?

WHERE MyProducts.ProdID=MSRPList.ProdID

У меня сразу full показало - правда на 8-ке
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874642
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima TНе понял: MSRPList.discontinued = .t. оно надо или нет?
не надо.
в моем случае аналогичного поля вообще нет - это не совсем точный пример из хелпа
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874665
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
piva, а у меня 8-ка такой синтаксис вообще не понимает
и запускаю на 9ке SP2
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874776
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейОт.е. вы считаете что delete sql неоптимизируется в принципе?
Похоже что так при таком использовании.

Мой пример можно на такой заменить:
Код: plaintext
1.
2.
3.
sele MSRPList
scan
    delete from MyProducts where MyProducts.ProdID = MSRPList.ProdID
endscan
этот delete оптимизируется.
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874782
АлексейОпоявилось какаято оптимазация промежуточного результата
но она мне не особо нужна, мне нужна оптимизация самого delete
поэтому подскажите пожалуйста как оптимизировать DELETE MyProducts FROM MSRPList WHERE MSRPList.ProdID = MyProducts.ProdIDА что тут еще оптимизировать? Здесь может мпомочь только уменьшения количества удаляемых записей. Вам не нравится Rushmore optimization level for table myproducts: none ? Так у Вас ни одного ограничения на эту таблицу нет. Что оптимизировать?
Определение идентификаиторов удаляемых записей идет по индексам:
Rushmore optimization level for intermediate result: full
Joining table myproducts and intermediate result using index tag Prodid
Что оптимизировать?
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874789
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
clear

Set Deleted On

CREATE CURSOR MyProducts (ProdID I , OurPrice Y NULL)
INSERT INTO MyProducts VALUES ( 1 , 1 . 10 ) && matches but is not marked for deletion
INSERT INTO MyProducts VALUES ( 2 , 2 . 20 ) && matches and is marked
INSERT INTO MyProducts VALUES ( 3 , 3 . 30 ) && matches and is marked
INDEX on ProdID tag ProdID
Index on deleted() tag del binary


CREATE CURSOR MSRPList (ProdID I , ProdCategory I Null, MSRP Y, Discontinued L) 
INSERT INTO MSRPList VALUES ( 1 ,  9 ,  1 . 00 , .f.) 
INSERT INTO MSRPList VALUES ( 2 ,  8 ,  2 . 00 , .t.) 
INSERT INTO MSRPList VALUES ( 3 ,  7 ,  3 . 00 , .t.) 
INDEX on ProdID tag ProdID
Index on deleted() tag del binary

SYS( 3054 , 12 )
DELETE  MyProducts ;
	FROM MSRPList ;
		inner join MyProducts on MSRPList.ProdID = MyProducts.ProdID;
    WHERE MSRPList.discontinued 
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874862
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
прошелмимо, круто!!!

DELETE MyProducts FROM MSRPList WHERE MyProducts.ProdID= MSRPList.ProdID && AND MSRPList.discontinued = .t.
Using index tag Del to rushmore optimize intermediate result
Rushmore optimization level for intermediate result: full
Using index tag Del to rushmore optimize table myproducts
Rushmore optimization level for table myproducts: full
Joining table myproducts and intermediate result using index tag Prodid

здорово...
но ... тогда придется держать такой экзотический индекс по delete() только ради удалений
впрочем это уже мне решать
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874881
прошелмимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейО
здорово...
но ... тогда придется держать такой экзотический индекс по delete() только ради удалений
впрочем это уже мне решать

его нужно не держать,
а создавать.
он не экзотический, а в усмерть обычный.

прочитайте про бинарные индексы и откройте для себя,
это то из новшеств, которое Вы упустили.
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36874924
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АлексейО, оптимизатор выбирает какой-то способ выполнения запроса, этот способ однозначно быстрее самого медленного (скан в скане), но не факт что выбран самый быстрый вариант.
Оптимизатор не учитывает все факторы влияющие на скорость, например таблица в сети или локально лежит.

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

АлексейОтогда придется держать такой экзотический индекс по delete()
Скорость померь в реальных условиях. Почти уверен что время работы запроса увеличится.
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36876405
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оптимизация вовсе не равнозначна ускорению. "Как правило", да, ускоряет. Но как поведет себя на практике, надо проверять. Как ни странно, но FULL оптимизация может привести к замедлению, а не к ускорению выполнения запроса. Как уже заметил Dima T надо проверять на практике, ускорился или замедлился запрос.
...
Рейтинг: 0 / 0
оптимизация delete sql
    #36876481
АлексейО
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,
я это прекрасно понимаю,
мало того: самый быстрый delete sql в моем случае выполняется 30 секунд
и все это время другие пользователи не могут открыть таблицу
поэтому в конце концов я выбрал средний вариант:
scan
delete where
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / оптимизация delete sql
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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