Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 7 8 9 10 11 [12] 13 14 15 16 .. 24   вперед  Ctrl
 Re: Покритикуйте Оракл 10г  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Gluk (Kazan)
И предвидя дольнейшие высказывания, в Oracle курсоры не просаживают производительность как в MS SQL :)


Т.е. для таблицы, скажем, с лимоном записей, что:

UPDATE
  SomeTable
SET
  SomeValue = 1

По быстродействию будет эквивалентно:

DECLARE CURSOR ...

OPEN ...

WHILE ...

  UPDATE ... WHERE CURENT OF ...

...

?
19 июл 07, 13:58    [4409686]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
pkarklin
Gluk (Kazan)
И предвидя дольнейшие высказывания, в Oracle курсоры не просаживают производительность как в MS SQL :)


Т.е. для таблицы, скажем, с лимоном записей, что:

UPDATE
  SomeTable
SET
  SomeValue = 1

По быстродействию будет эквивалентно:

DECLARE CURSOR ...

OPEN ...

WHILE ...

  UPDATE ... WHERE CURENT OF ...

...

?


в общем случае конечно нет, но важно понимать, что одиночный update откроет точь в точь такой же курсор как и тот что писан ручками и сам по себе курсор не создаст дополнительных накладных расходов
19 июл 07, 14:04    [4409754]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Bogdanov Andrey
Gluk (Kazan)
locky

  i MYWIDETABLE%rowtype;
потом это всё растекается по коду, передается/получается и т.п.
я, честно говоря, не шибко знаю как работает оптимизатор оракла, но
что-то мне подсказывает - второй вариант хуже первого.


Неправильно вам это что то подсказывает. Во первых вариант НИЧЕМ не хуже, во вторых это РЕКОМЕНДУЕМАЯ практика (правда я обычно использую %type, но это дело вкуса),


Ну в данном случае вместо обявления числовой переменной объявляется запись. Естественно, использование table.Name%type - рекомендумое и оправданное, а вот использовать запись это наверное действительно излишне.


меня тоже в вела заблуждение i
Но задумайтесь, кто и когда сказал вам, что это ЧИСЛОВАЯ переменная ? ;)
19 июл 07, 14:06    [4409770]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67454
Блог
locky
Вы знаете... В последнее время приходится перекапывать очень много
ораклового кода... Дык - люди в 90% случаев - неправильно и "неправомерно" использую коллекции, rowtype, исключения...

Знаю и верю. И знаю, что с такими людьми делать. И вовсе не "переделывать сервер так, чтобы им было удобнее ошибаться".

А люди.... помнится, одного студента я за неделю так и не смог отучить писать

if <something> then
  raise SomeException ;
  return ;
end if ;
19 июл 07, 14:06    [4409779]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Gluk (Kazan) wrote:
> Неправильно вам это что то подсказывает. Во первых вариант НИЧЕМ не
> хуже, во вторых это РЕКОМЕНДУЕМАЯ практика (правда я обычно использую
> %type, но это дело вкуса), которая ГАРАНТИРУЕТ, что переменные скрипта
> совпадают по типу с соответствующими столбцами таблицы и уберегает тем
> самым от многих неприятностей при alter этих таблиц.
> Уверен, что в случае с исключениями (а возможно и с коллекциями) что-то
> тоже подсказало вам НЕ СОВСЕМ правильно.
Если бы там был %type - вопросов не было бы. но %rowtype - это, имхо -
слишком....

  begin
   select count(*) into i from all_objects where 1=2;
  exception
   when NO_DATA_FOUND then null;
  end;

    begin
     .......
   exception
    when others then null;
   end;

по моему - не самые нормальные способы обработки исключений.
Если в первом случае - это просто излишетсво, то во втором - явно
вредительство :)

А с коллекциями... Очень часто встречается "код по учебнику" - select
.... bulk collect into ... for.... update...
вместо обычного update - тоже, знаете-ли - не самый лучший способ.

Posted via ActualForum NNTP Server 1.4

19 июл 07, 14:07    [4409787]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Gluk (Kazan) wrote:
> меня тоже в вела заблуждение i
> Но задумайтесь, кто и когда сказал вам, что это ЧИСЛОВАЯ переменная ? ;)
Я сказал...
когда написал I integer :)

Posted via ActualForum NNTP Server 1.4

19 июл 07, 14:08    [4409806]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky

Gluk (Kazan) wrote:
> меня тоже в вела заблуждение i
> Но задумайтесь, кто и когда сказал вам, что это ЧИСЛОВАЯ переменная ? ;)
Я сказал...
когда написал I integer :)
Posted via ActualForum NNTP Server 1.4


ну насчет вместо, то могло быть ваше предположение и позднее я пропустил его между ушей.
то что вы запостили по исключения (именно в таком виде) безусловно дико, но я опять же не исключаю, что имеет место случай "мне Мойша напел"

В любом случае, не видя оригинала сложно делать оценки профпригодности и вменяемости разработчика, но я согласен с softwarer в том что д...ов (термин мой) везде хватает.

Речь может вестись только о том, поощеряет ли инструмент такой долбо...им
19 июл 07, 14:19    [4409905]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Gluk (Kazan)
в общем случае конечно нет, но важно понимать, что одиночный update откроет точь в точь такой же курсор как и тот что писан ручками и сам по себе курсор не создаст дополнительных накладных расходов


Давайте будем честными и скажем, что курсор в MS SQL и курсор в Oracle две большие разницы по своей сути. Если в первом он предназначен для организации навигационного подхода при "обходе" записей, то во втором - это сама суть движка. Поэтому сравнивать их быстродействие, учитывая разную их природу и само назначение, на мой взгляд не корректно.
19 июл 07, 14:21    [4409926]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
pkarklin
Давайте будем честными и скажем, что курсор в MS SQL и курсор в Oracle две большие разницы по своей сути.


спасибо :) именно об этом я и хотел сказать
19 июл 07, 14:37    [4410038]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Gluk (Kazan) wrote:
> то что вы запостили по исключения (именно в таком виде) безусловно дико,
> но я опять же не исключаю, что имеет место случай "мне Мойша напел"
ну... when others then null - постоянно встречается...
when NO_DATA_FOUND при аггрегатах - чистая правда, только там, ессно не
all_objects, а кастомерская табличка...

Posted via ActualForum NNTP Server 1.4

19 июл 07, 15:10    [4410328]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky

Gluk (Kazan) wrote:
> то что вы запостили по исключения (именно в таком виде) безусловно дико,
> но я опять же не исключаю, что имеет место случай "мне Мойша напел"
ну... when others then null - постоянно встречается...
when NO_DATA_FOUND при аггрегатах - чистая правда, только там, ессно не
all_objects, а кастомерская табличка...


я и говорю, "Мойша напел", меня больше не all_objects смущает а попытка поймать NO_DATA_FOUND при запросе который заведомо вернет (именно) 0 без всяких эксепшинов.
Гарантированно !!! Призначайтесь, где еще отсебятина.

Что касается others then null, болезнь действительно встречается довольно часто. Мы с ней боремся.
19 июл 07, 15:57    [4410793]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Gluk (Kazan) wrote:
> я и говорю, "Мойша напел", меня больше не all_objects смущает а попытка
> поймать NO_DATA_FOUND при запросе который заведомо вернет (именно) 0 без
> всяких эксепшинов.
> Гарантированно !!! Призначайтесь, где еще отсебятина.
Ой, можно подумать если написать count с другими условиями - там будет
исключение :)
я, конечно, могу поискать ЧИСТЫЙ исходный текст - но, поверьте, в облом...
В той базке - всё так было написано :(
Или - копи-паст, или - один раз кто-то написал, остальные - давай за ним...

Posted via ActualForum NNTP Server 1.4

19 июл 07, 15:59    [4410818]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Gluk (Kazan)
меня больше не all_objects смущает а попытка поймать NO_DATA_FOUND при запросе который заведомо вернет (именно) 0 без всяких эксепшинов.
Гарантированно !!! Призначайтесь, где еще отсебятина.


К большому сожалению, такое действительно встречается довольно часто. Вот кусок реального кода (кем он написан - не знаю):

procedure pAssertAccount(p_id IN tAccount.account_Id%TYPE)
-- This procedure assert IN parameter to be valid account_id
is
   l_count   INTEGER;
begin
    select count(*) into l_count
      from tAccount where account_id = p_id;
exception
  when NO_DATA_FOUND then
     raise_application_error(-20101,'Unknown account_id = ' || p_id || ' provided ');
  when others then
         l_errCode := SQLCODE;
         l_errMsg := SQLERRM;
         raise_application_error(-20102, l_errmsg);
end pAssertAccount;

Этот код гарантированно бессмысленнен, но тот кто его писал, видимо считал, что что-то он проверяет.
19 июл 07, 16:09    [4410910]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 122113
locky

Ой, можно подумать если написать count с другими условиями - там будет
исключение :)


Хи - хи.

select count(*)
from all_tables
group by table_name
having count(*) = 0
19 июл 07, 16:14    [4410964]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 122113
Bogdanov Andrey
Gluk (Kazan)
меня больше не all_objects смущает а попытка поймать NO_DATA_FOUND при запросе который заведомо вернет (именно) 0 без всяких эксепшинов.
Гарантированно !!! Призначайтесь, где еще отсебятина.


К большому сожалению, такое действительно встречается довольно часто. Вот кусок реального кода (кем он написан - не знаю):

procedure pAssertAccount(p_id IN tAccount.account_Id%TYPE)
-- This procedure assert IN parameter to be valid account_id
is
   l_count   INTEGER;
begin
    select count(*) into l_count
      from tAccount where account_id = p_id;
exception
  when NO_DATA_FOUND then
     raise_application_error(-20101,'Unknown account_id = ' || p_id || ' provided ');
  when others then
         l_errCode := SQLCODE;
         l_errMsg := SQLERRM;
         raise_application_error(-20102, l_errmsg);
end pAssertAccount;

Этот код гарантированно бессмысленнен, но тот кто его писал, видимо считал, что что-то он проверяет.


Да. Это распространенная ошибка. Он конечно проверял наличие/отсутствие записи,
но забыл, что в данном случае нужно проверять условие if l_count = 0
19 июл 07, 16:16    [4410985]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

dmidek wrote:
> select count(*)
> from all_tables
> group by table_name
> having count(*) = *0*
Нда...
Ну, такого там не было :)

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

Posted via ActualForum NNTP Server 1.4

19 июл 07, 16:39    [4411201]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 122113
locky

dmidek wrote:
> select count(*)
> from all_tables
> group by table_name
> having count(*) = *0*
Нда...
Ну, такого там не было :)

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

Posted via ActualForum NNTP Server 1.4


Да. Динамический SQL часто используется не по назначению.
Особенно программисты почему то грешат этим в конcтрукции
OPEN FOR
19 июл 07, 16:43    [4411250]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

dmidek wrote:
> Да. Это распространенная ошибка. Он конечно проверял наличие/отсутствие
> записи,
> но забыл, что в данном случае нужно проверять условие if l_count = 0
Хреновый, кстате, способ проверки - есть ли нужная запись.
В данном случае вроде бы должна быть только одна...
но вот когда такого рода запросы лепят, дабы проверить - а если ли хотя
бы одна зависимая запись, по итогу пересчитывая ВСЕ записи (хотя нах это
надо?) - это грустно....

С другой стороны, я как вспомню что один студиоуз у меня писал... ой,
плакать хоцца :(

Posted via ActualForum NNTP Server 1.4

19 июл 07, 16:44    [4411252]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 122113
locky

dmidek wrote:
> Да. Это распространенная ошибка. Он конечно проверял наличие/отсутствие
> записи,
> но забыл, что в данном случае нужно проверять условие if l_count = 0
Хреновый, кстате, способ проверки - есть ли нужная запись.


Согласен. Лучше тогда добавлять хотя бы AND rownum = 1,
пользоваться EXISTS или писать "псевдоцикл" FOR I IN (SELECT ... WHERE rownum = 1)
19 июл 07, 16:48    [4411291]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky

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


Ну не думаю что все НАСТОЛЬКО плохо. Скорее всего все таки идет проверка наличия записей, удовлетворяющих условию равенства на идексированный столбец (возможно с доп.условиями). Без излишкств с FullScan-ами по всей таблице.

лично я делаю update и последующий insert, в случае если изменено 0 строк
19 июл 07, 16:48    [4411296]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 122113
Gluk (Kazan)
locky

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


Ну не думаю что все НАСТОЛЬКО плохо. Скорее всего все таки идет проверка наличия записей, удовлетворяющих условию равенства на идексированный столбец (возможно с доп.условиями). Без излишкств с FullScan-ами по всей таблице.

лично я делаю update и последующий insert, в случае если изменено 0 строк


Не совсем понял, как это соотносится с примером (у Вас более частный случай),
но в Вашем случае как раз хорош MERGE (>= 9)
19 июл 07, 16:51    [4411321]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Gluk (Kazan) wrote:
> Ну не думаю что все НАСТОЛЬКО плохо. Скорее всего все таки идет проверка
> наличия записей, удовлетворяющих условию равенства на идексированный
> столбец (возможно с доп.условиями). Без излишкств с FullScan-ами по всей
> таблице.
ну и нахрена оно мне, спрашивается?
Отлично! У меня (ессно) есть индекс по нужному мне столбцу...
но что-то меня мало радовать будет, если мне select count(*) сосчитает -
"Ой, мужыг! У тебя 632145 строчек документа! Низзя удалять заголовок!"...
Оно понятно - с индексом куда быстрее, чем без оного, но - надож иметь
понятие, йопт!
и правда, rownum бы приписали, чтоль :)
по руцям за такое бить - нещадно.


кста, а дайте мне тынц, где было бы написано - с каково бодуна появилось
понятие NO_DATA_FOUND? ну - не нашлось данных, дык чего - это ошибка? :(
Не флейма ради- просто хоцца понять логику.

Posted via ActualForum NNTP Server 1.4

19 июл 07, 16:54    [4411338]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
dmidek
Gluk (Kazan)
locky

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


Ну не думаю что все НАСТОЛЬКО плохо. Скорее всего все таки идет проверка наличия записей, удовлетворяющих условию равенства на идексированный столбец (возможно с доп.условиями). Без излишкств с FullScan-ами по всей таблице.

лично я делаю update и последующий insert, в случае если изменено 0 строк


Не совсем понял, как это соотносится с примером (у Вас более частный случай),
но в Вашем случае как раз хорош MERGE (>= 9)


ага, это к слову.
чтоже (с) иногда приходится и на 8-ке
19 июл 07, 17:05    [4411431]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
locky

кста, а дайте мне тынц, где было бы написано - с каково бодуна появилось
понятие NO_DATA_FOUND? ну - не нашлось данных, дык чего - это ошибка? :(
Не флейма ради- просто хоцца понять логику.


Не надо тут тынцей, если бы не было count летели бы эксцепшины на 0 строк и на более одной строки.
19 июл 07, 17:07    [4411453]     Ответить | Цитировать Сообщить модератору
 Re: Покритикуйте Оракл 10г  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034

Gluk (Kazan) wrote:
> Не надо тут тынцей, если бы не было count летели бы эксцепшины на 0
> строк и на более одной строки.
и в чем трагедия? в том, что выбралось 0 строк?
Вот этого то я и не понимаю.
Если TOO_MANY_ROWS - в принципе вполне логично и понятно (ибо нехрен в
скаляр пихать вектор), то NO_DATA_FOUND - как-то немного странно.

Posted via ActualForum NNTP Server 1.4

19 июл 07, 17:09    [4411466]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 7 8 9 10 11 [12] 13 14 15 16 .. 24   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить