Страница 1 из 1
хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-15 9:28:58
ProFTP
нужно сделать сложные запросы, еще сложнее чем этот в низу...
процедуру SQL что-то не хочется использовать, в любом случае, если сервер глюканет сильно или если выключить
./mysql.server stop, то выполняемые запросы оборвутся, правильно?
тем более нужно сделать несколько циклов while, в процедуре что-то не знаю не очень как это сделать
Код: Выделить всё
UPDATE test1
SET close = 1
WHERE id = (SELECT id
FROM
test1
WHERE
parent = :P
UNION
SELECT t1.id
FROM
test1 t1 JOIN test1 t2
ON t1.parent = t2.id
WHERE
t2.parent = :P )
и вот такое можно ли сделать
(условно)
Код: Выделить всё
$ss = 'SELECT id_se
FROM section
WHERE id = 1';
while ($id_se = $ss ) {
$ss2 = 'SELECT id_se
FROM
section
WHERE
parent_se_id = 13
UNION
SELECT t1.id_se
FROM
section t1 JOIN section t2
ON t1.parent_se_id = t2.id_se
WHERE
t2.parent_se_id = 13';
while ( $id = $ss2 ) {
DELETE from t1,t2,t3,t4
where id = $id bla-lba-bla
}
}
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 11:16:36
zingel
plsql такое умеет
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 14:51:03
Fastman
Хранить в базе логику - зло !
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 15:55:12
ProFTP
нашел:
Код: Выделить всё
* Incorrectly used table in subquery:
Error 1093 (ER_UPDATE_TABLE_USED)
SQLSTATE = HY000
Message = "You can't specify target table 'x'
for update in FROM clause"
This error will occur in cases like this:
UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
It's okay to use a subquery for assignment within an UPDATE statement, since subqueries are legal in UPDATE and DELETE statements as well as in
SELECT statements. However, you cannot use the same table, in this case table t1, for both the subquery's FROM clause and the update target.
Usually, failure of a subquery causes the entire statement to fail.
но тут можно так написать
Код: Выделить всё
UPDATE section AS t4 LEFT JOIN section t2 ON t4.parent_se_id = t2.id_se
SET t4.active_se = 1 - t4.active_se
WHERE t2.parent_se_id = 54 or t4.parent_se_id = 54
zingel писал(а):plsql такое умеет
MySQL это тоже умеет, большие возможности не давно появились, но там говорят что все есть
http://habrahabr.ru/blogs/mysql/63883/
в PgSQL оно появилось давно и там много чего понадобавляли
Fastman писал(а):Хранить в базе логику - зло !
а те запросы которые нельзя написать в один или в два запроса?
можно форкнутся, тогда все выполниться независимо от родителя скрипта...
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 16:42:27
hizel
Fastman писал(а):Хранить в базе логику - зло !
ты об этом оракловодам пошути :]
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 16:53:43
Fastman
hizel писал(а):Fastman писал(а):Хранить в базе логику - зло !
ты об этом оракловодам пошути :]
С ними шутить - себе дороже.
А поковырявшись в базах с логикой внутри - я решил что буду предавать анафеме всех кто проповедует этот путь.
Ибо, поддержка и обслуживание этих шняг - кровавое и неблагородное дело.
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 17:55:54
hizel
тото оракул в свое поделие две жабо-машины заталкал :]
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 22:26:26
ProFTP
я оракол не использовал, а почему ты говришь что она жрет много? там что конфига нету? я тоже моуг выжедить в конфиге память для MySQL
говорят что мускл не выдержит большую базу 200Gb - 4T
где-то было написано, что оракл может обработать как-то в один поток все, по этому ему передают все в одном запросе, а mysql все равно что 1-2 или 4 запроса, но рекоменжуется не больше 15... хотя извезные большие движки и 33 передают
вот зайти там посмотри там написано 33
http://forum.vingrad.ru/forum/topic-258166.html
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 22:28:45
Fastman
ProFTP писал(а):я оракол не использовал, а почему ты говришь что она жрет много? нам что окнфига нету? я тоже моуг выжедить в конфиге память для MySQL
говорят что мускл не выдержит большую базу 200Gb - 4T
где-то было написано, что оракл может обработать как-то в один поток все, по этому ему передают все в одном запросе, а mysql все равно что 1-2 или 4 запроса, но рекоменжуется не больше 15... хотя исвезные большие движки и 20 передают
На заборе тоже X%$ написано... подойдешь..потрогаешь - сучок мля...
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-17 23:02:59
ProFTP
как там в Минске после потопа?
onliner.by

Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-08-18 0:04:46
Fastman
offtop.
Это не место для таких вопросо. есть /dev/null
P.S.
Ну поплавали немного....
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-13 0:41:39
buryanov
Знакомые программеры для клиента переносили продукт с oracle на mysql, клиент не хотел покупать лицензию на oracle. Вся логика хранится на сервере, написано огромное колличество процедур, функций и тригеров.
Насчёт больших баз: за месяц база выростает до 1-1,5Тб, потом бекап, вычистка, создание нового периода и всё по новой. После 20 числа серверу тяжеловато, до 90% загрузка, 1 числа идёт пересоздание, парерасчёт и сравнение отчётов, заргузка 100%. За 1,5 года ниодного подвисания и отказа.
Железо: 2 xeon 5440, 32G ram.
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-13 0:56:32
Fastman
buryanov писал(а):Знакомые программеры для клиента переносили продукт с oracle на mysql, клиент не хотел покупать лицензию на oracle. Вся логика хранится на сервере, написано огромное колличество процедур, функций и тригеров.
Насчёт больших баз: за месяц база выростает до 1-1,5Тб, потом бекап, вычистка, создание нового периода и всё по новой. После 20 числа серверу тяжеловато, до 90% загрузка, 1 числа идёт пересоздание, парерасчёт и сравнение отчётов, заргузка 100%. За 1,5 года ниодного подвисания и отказа.
Железо: 2 xeon 5440, 32G ram.
Умеючи и x*й сломать можно.
Я верю в героизм и умение наших програмеров, и не такое делали

Но я бы не хотел через еще полтора года разбираться с этим, когда "знакомые програмеры"
пропадут либо не станут заниматься этим хламом. Плавали - знаем
P.S.
Програмеры странные.. наиболее близкий аналог Oracle - PostgreSQL. С учетом того что триггеры появились например в mySQL только с 5.0.2 версии... более чем спорно....
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-13 1:03:56
buryanov
"знакомые програмеры"
- довольно крупная софтверная фирма, ветка - 5.1. Раз в 2-3 месяца, мускул обновляется.
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-13 1:16:40
Fastman
buryanov писал(а): "знакомые програмеры"
- довольно крупная софтверная фирма, ветка - 5.1. Раз в 2-3 месяца, мускул обновляется.
Да я честно не против..всякие ситуации бывают... Возможно действительно толковые ребята и сделали все грамотна.
Просто сам по работе столкнулся с такими базами "больших известных" фирм...

Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-14 2:12:42
zingel
Насчёт больших баз: за месяц база выростает до 1-1,5Тб,
признайтесь, это яндекс?

Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-16 18:49:10
ProFTP
полдскажите такой запрос можно как-то оптимизирвоать (этот запрос может часто выполнятся) ??
Код: Выделить всё
my $sql_par = 'SELECT id_se
FROM section
WHERE
parent_se_id = '.$args[0].'
UNION
SELECT t1.id_se
FROM
section t1 JOIN section t2
ON t1.parent_se_id = t2.id_se
WHERE
t2.parent_se_id = '.$args[0];
my $sth = $dbh->prepare($sql_par);
$sth->execute();
while ( my $id = $sth->fetchrow_arrayref() ) {
$dbh->do( 'DELETE from section
WHERE id_se = '.$id->[0],
undef, undef );
$dbh->do( 'DELETE from comment
WHERE id_se = '.$id->[0],
undef, undef );
$dbh->do( 'DELETE from content
WHERE id_se = '.$id->[0],
undef, undef );
}
$sth->finish();
$dbh->do( 'DELETE from section
WHERE id_se = '.$args[0],
undef, undef );
$dbh->do( 'DELETE from comment
WHERE id_se = '.$args[0],
undef, undef );
$dbh->do( 'DELETE from content
WHERE id_se = '.$args[0],
undef, undef );
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-16 18:51:07
ProFTP
buryanov писал(а):Знакомые программеры для клиента переносили продукт с oracle на mysql
что за продукты?
oracle для разработчиков бесплтаный, его поставить можно кажется тестово... только в коммерческих проектах нельзя
если ты поставишь где-то на VPS на свой веб-сервер, разве это нельзя?
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-09-16 23:47:00
buryanov
ProFTP писал(а):buryanov писал(а):Знакомые программеры для клиента переносили продукт с oracle на mysql
что за продукты?
билинг
ProFTP писал(а):
oracle для разработчиков бесплтаный, его поставить можно кажется тестово... только в коммерческих проектах нельзя
если ты поставишь где-то на VPS на свой веб-сервер, разве это нельзя?
если вы его(oracle) не продавали, хотя есть express(помоему так называется)версия, бесплатная. Я пока ещё ниразу не слышал, чтобы ктото из проверяющих, интересовался oracle.
Re: хранимая процедура Vs fork (новый процесс)
Добавлено: 2009-10-05 8:42:29
ProFTP
я вот как раз хотел оптимизировать DELETE
Есть таблица составных деталей с "древесной" структурой, т.е. код/код предка/название, например:
Код: Выделить всё
CREATE tree (i, parent_id i, name c(10))
INSERT INTO tree VALUES (1,0,'Деталь1')
INSERT INTO tree VALUES (2,0,'Деталь2')
INSERT INTO tree VALUES (3,2,'Деталь3')
INSERT INTO tree VALUES (4,2,'Деталь4')
INSERT INTO tree VALUES (5,4,'Деталь5')
INSERT INTO tree VALUES (6,4,'Деталь6')
INSERT INTO tree VALUES (7,5,'Деталь7')
Как в такой таблице красиво сделать рекурсивное удаление всех потомков при удалении записи (чтобы при удалении детали №4 удалились детали №5,6,7)? И можно ли это сделать через ХП?
вот я это нашел...
http://forum.foxclub.ru/read.php?29,400359,400507
например на Visual Foxpro:
Код: Выделить всё
DelTree (2)
PROCEDURE DelTree (tnID)
LOCAL laChilds[1], ln1
SELECT det_id FROM tree WHERE parent_id = m.tnID INTO ARRAY laChilds
FOR ln1 = 1 TO _TALLY
DelTree (laChilds[m.ln1])
ENDFOR
DELETE FROM tree WHERE det_id = m.tnID
ENDPROC
но как написать это на
MySQL, например, на триггерах или процедурах? или без них?
не могу понять как это сделать вообще, путаюсь...