Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / оптимизация delete sql / 20 сообщений из 20, страница 1 из 1
30.09.2010, 14:04
    #36874469
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
возьмем пример из хелпа и немножко подправим
Код: 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
30.09.2010, 14:09
    #36874484
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
ой
в строке DELETE слово force лишнее
что с ним что без него план оптимизации не меняется
...
Рейтинг: 0 / 0
30.09.2010, 14:13
    #36874493
оптимизация delete sql
АлексейО,
а при чем тут delete? Дело не в нем, ав отсутствии нужных индексов. Которые нужны не только для delete.
Создайте примерно такой дополнительный индекс
Код: plaintext
Index on Discontinued tag Discont binary
и сравните.
...
Рейтинг: 0 / 0
30.09.2010, 14:17
    #36874510
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
я поступил так:
Код: 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
30.09.2010, 14:22
    #36874525
оптимизация delete sql
АлексейО,
Вы мое сообщение читали? А выполнить предложенное пробовали?
...
Рейтинг: 0 / 0
30.09.2010, 14:44
    #36874598
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
ну да прикольно:
картинка изменилась:

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
30.09.2010, 14:49
    #36874611
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
Я так понимаю фокс делает полный скан по 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
30.09.2010, 14:50
    #36874619
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
АлексейО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
30.09.2010, 14:53
    #36874628
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
Dima TЯ так понимаю фокс делает полный скан по MyProducts проверяя наличие MSRPList.ProdID по индексу MSRPList.ProdID. Отсюда и тормоза при большой таблице MyProducts.
ну я тоже так понимаюDima T
Если MSRPList небольшая таблица
мой аналог MyProducts довольно большая таблица и полный скан да по сети это несколько минут - неустраивает
т.е. вы считаете что delete sql неоптимизируется в принципе?
...
Рейтинг: 0 / 0
30.09.2010, 14:56
    #36874641
piva
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
Выражение в WHERE местами поменять не пробовали ?

WHERE MyProducts.ProdID=MSRPList.ProdID

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

Мой пример можно на такой заменить:
Код: plaintext
1.
2.
3.
sele MSRPList
scan
    delete from MyProducts where MyProducts.ProdID = MSRPList.ProdID
endscan
этот delete оптимизируется.
...
Рейтинг: 0 / 0
30.09.2010, 15:25
    #36874782
оптимизация delete sql
АлексейОпоявилось какаято оптимазация промежуточного результата
но она мне не особо нужна, мне нужна оптимизация самого 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
30.09.2010, 15:28
    #36874789
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
Код: 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
30.09.2010, 15:42
    #36874862
АлексейО
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
прошелмимо, круто!!!

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
30.09.2010, 15:46
    #36874881
прошелмимо
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
оптимизация delete sql
АлексейО
здорово...
но ... тогда придется держать такой экзотический индекс по delete() только ради удалений
впрочем это уже мне решать

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

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

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

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


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