|
|
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Меня в форуме запутали. Я спросил: "Есть много таблиц главные ключи которых формир-ся автоматом в тригере на инсерт с использ-ем секвенции. Как лучше (оптимальнее) - создать одну последовательность для всех этих таблиц (около 50 штук), или для каждой табл. создать свою секвенцию?" а Oracle X-pert посоветовал ключ формировать так: NVL(max(id),0) + 1 Into iterator from my_tab; :NEW.ID := iterator; Как все же лучше, правильнее ? Чем предложенный способ лучше (или хуже)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 10:33 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Нафига заводишь новый топик? Делать нечего что-ли? Сгруппируй таблицы по логическому признаку и выдели на каждую группу - по сиквенсу. Например: 1) таблицы платёжных документов, таблицы остатков, таблицы счетов - 1 сиквенс 2) справочники: валют, курсов валют, справочник подразделений итд - 1 сиквенс 3) таблица основных средств, таблица материальных средств - 1 сиквенс итд итп ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 10:39 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
А про запрос я тебе написал в том топике: " Аукнится, еще как аукнится. Представь несколько пользователей одновременно обращаются к такой таблице с помощью вышеуказанного запроса - все пользователи получают одно и тоже значение и все пытаются вставить новую строку. В итоге - тот кто успел раньше - тот молодец, тот кто не успел, тот как говорится - будет заново вводить данные в какой нибудь форме итд итп. Опять же дополнительная нагрузка - ведь такой способ предлагается для всех таблиц. Так вот представь, теперь для каждой вставки нужно будет делать всегда запрос. В итоге производительность работы юзеров резко падает, кого будут после этого бить по голове - сам понимаешь. " ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 10:41 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Delaj normaljno - sequence dlja kazhdoi tabljici. Budjesh izpoljzovatj 1 seq dlja vseh tabljic, budet probljemi. Primer - eslji shto to sluchitsja s edinstvenoi seq, insert nebudet rabotatj na vsjeh tabljic. Variant "select max(id) ..." njesovetuju: 1) chasto bivajut situaciji, kogda v insert triggere deajetsja insert v druguju tabljicu i tak dalje - poluchish kuchu "select max() " kogda hotjel tolkjo sdelatj insert. Zachem eto? 2) A jeslji takaja situacija: insert -> max(id) = 1 insert -> max (id) = 2 .. insert -> max(id) = 230 delete some rows insert -> max(id) = 118 ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 11:00 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Softbuildery!! Trigger rabotaet per row! Poetomy vse , chto ty pisal - neverno! Dlya Spravki:: Po takomy prinzipy rabotaet generaziya ID na site'www.cnn.com' ( ~ 10^9 zaprosov v sytki ) i ne padaet! S seq takoi proizvoditel'nosti ne dostignut' Bye. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 11:01 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
to Oracle X-pert: Твой метод не похож на метод, котрый должен предлагать эксперт по Oracle. Это больше похоже на совет от разработчика на FoxPro, Paradox и им подобным. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 11:16 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Nu a MAX(ID) kakoe znachenie vernet? Eto ge ne count(id)...... A nachet Paradox or FoxPro... "Windows" I "Mouse" toge ne izobretenie Microsoft...., odnako esli vesh' poleznaya, to pocchemy - by ee ne ispol'zovat? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 11:38 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Я бы советовал подумать над вариантом с естественными ключами. Во многих случаях это эффективнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 11:46 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
>>> Trigger rabotaet per row! >>> Dlya Spravki:: Po takomy prinzipy rabotaet generaziya ID na site'www.cnn.com' 1) Trigger deystvitelno per row NO V KONTEKSTE SESSII A NE V KONTEKSTE INSATNCE ILI DATABASE eto est 3 bolshie raznicy 2) ... rabotaet generaziya ID na site'www.cnn.com' --> ne yavlyaetsya PRAVILNYM PRIMEROM poskolku on rabotaet v APPLICATION SERVER okrugenii cherez 1 connect ili cherez 1 connection pool ( i connect i connection pool est POSLEDOVATELNOE FORMIROVANIE POTOKA ZAPROSOV K DB) v Client-Server arhitekture principy connecta drugie -- PARRALELNOE FORMIROVANIE POTOKA ZAPROSOV K DB) posemu stepen doveriya k dannomu primery nedysoka. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 19:20 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Predposylki pochti vernye. Trigger i v etom sluchae dast unique number. V primere on rabotaet protiv 5 Apache serverov, t.chto, kak min, 5 connection pools, no ne padaet na exceptions..... chto dumaesh po etomy povody? A kak resume:: Oracle daet dostatochno vozmognostei, chtoby reshat' ety problemy v kagdom konkretnom sluchae. Esli net ogranichenii na poryadok posledovatelnostei v seq, to , obychno, primenyaetsya sequence. Pro etom daetsya dostatochno bol'shoe keshirovanie, chtoby ne zamedlyat' transactions. V sluchae, esli poriadok strogo reglamentiryetsya, naprimer pri sozdanii nomerov form na denegnye operazii s ychetem vremeni ih postupleniya { dopystim, pri Billing systems na cellular phones } - to luche ispol'zovat' generaziu NE SEQUENCE number. Odnim iz sposobov pri etom i yavlaetsya trigger, a , kak variant - Java engine. Vybor, obychno, za postanovshikom zadach. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 20:07 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
>>> V primere on rabotaet protiv 5 Apache serverov, t.chto, kak min, 5 connection pools, >>> no ne padaet na exceptions..... >>> chto dumaesh po etomy povody? Ya dumau po etomu povodu ochen prosto: Apache -- HTTP server (no ne application server) Za Apache dolgen stoyat kakoy-libo (kakie-libo) application servera a-lya Tomcat, Jrun, ... Za application serveramy mogut stoyat (a mogut i ne stoyat) EJB servera. I connection pool formiruetsya na application/EJB servere (ne na Apache). A vot skolko ih a v kakom regime ony obschautsya s database eto i est sut problemy rasparallelivaniya potoka zaprosov. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.02.2003, 20:30 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
2 Владимир П. А в том случае ежели по независящим от тебя причинам естественный ключ обязан быть продублирован? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2003, 11:36 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
2 Владимир П. А в том случае ежели по независящим от тебя причинам естественный ключ обязан быть продублирован? "Кто дЭвушку ужинает -- тот ее и танцует!" (с) анекдот ... ИМХО -- кто за целостность отвечает, тот и генерит PK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2003, 11:37 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
2 ShgGena:: Apache/HTTP server NE obshaetsya s Application Server! Request Formiruetsya samoi DB 9i ( Object with full interface ( sm Page's Source) was loaded into Oracle's kernel). Oracle 9i INCLUDE Apache/HTTP. Connection pool formiruetsya Listenerom ( multi port ). Sut' problemy:: Kak obespechit' vzaimodeistvie parallel'nyh potokov Data pri yslovii STROGOGO cobludeniya ocherednosti po vremeni request. Seq ne MOGET v prinzipe dat' polnoi posledovatel;nosti. naprimer, v sluchae ROLLBACK schetchik nevozmogno cbrosit'. Trigger ot etih nedostatkov svoboden. Schema zaproca, povtoryau:: Client<->..<->Apache<->Listener<->Data Base Pochemy-to NIKTO ne poprobovat eto konkretno v primere:: create table test ( id number, attrib_1 varchar2(100), attrib_2 varchar2(100), attrib_r varchar2(100) ) pctfree 15 pctused 85 initrans 50 maxtrans 255 storage ( initial 100M next 100M minextents 2 maxextents 1024 pctincrease 0 ); alter table test add constraint pk_test_id primary key (ID); create or replace trigger trg_test before insert on test for each row declare -- iterator Integer := 0; begin select NVL(max(id),0) + 1 Into :NEW.Id From test; exception when Others Then raise .... end aa; Zapustit' insert v neskol'kix sessiyah ! ( Obrashau vnimanie na parameter initrans 50) To ge samou, s sequense! Seq bystree vyletit na SEQUENCE_CASH_WAIT + share_pool_wait, chem poluchite RAISE DUP_ON_VALUE..i est' mnogo sistem, gde eto kritichnee ( rabotaushih 24X7) ------------ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2003, 12:38 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
>> Schema zaproca, povtoryau:: >> Client<->..<->Apache<->Listener<->Data Base >> >> Connection pool formiruetsya Listenerom ( multi port ). Oracle X-Pert выдал совершенно новую архитектуру Oracle Net/HTTP сервисов. Скорее всего даже в Oracle Corporation об етих возможностях никто ничего не знал. ---------------------------------------------------------------------------- А теперь по сути: -- 1 - при обычном соединении или при обработке http сессии или при выполнении коннекта к XML DB (FTP протокол) listener не занимается собственно обработкой запроса, а только : а) в Dedicated server mode - образует новый серверный процесс + назначает ему (для TCP) номер порта а после того немедленно отваливается и ждет новых запросов НА КОННЕКТ по заданному (by default 1521) порту б) в Shared server mode - ищет свободный диспетчер (если отсутствует и не превышен параметр MAX_DISPATCHERS то образует новый) отдает ему параметры клиента + назначает ему номер порта а после того немедленно отваливается и ждет новых запросов НА КОННЕКТ. Диспетчер ставит запрос в очередь к разделяемым серверам для (собственно) обработки запросов. и.т.д ---------------------------------------------------------------------------- Client<->..<->Apache<->Listener<->Data Base Если-бы сервер работал таким образом то: 1 - листенер должен был бы отвечать за чтение физических блоков из файлов данных - КРУТО!!! 2 - иметь PGA / UGA для сессий, а в случае "( multi port )" - пул областей PGA / UGA для сессий -- ЕЩЕ КРУЧЕ!!! ---------------------------------------------------------------------------- Собственно возникае законный вопрос : А уважаемый X-Pert представляет как oracle работает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2003, 19:04 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Sm documentaziy k Oracle HTTP cartridge (OWA serial). Tam i opisany technology of DB 9i. Po krainei mere, y tebya ne vozniknet bolee voprosov tipa 'ESLI'. King Regards! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2003, 19:15 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
I potom, rebyata! Pridergivaites' vse-taki mneniya: 'Ia znau, chto ya nichego ne znau". Togda i ne bydete gluposti pisat'! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.03.2003, 19:16 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
>> Sm documentaziy k Oracle HTTP cartridge (OWA serial). >> Tam i opisany technology of DB 9i. >> Togda i ne bydete gluposti pisat'! Oracle HTTP cartridge и OWA (Oracle Web Agent), включая mod_plsql являются частью ORACLE APPLICATION SERVER ( и к Oracle Database Sever не имеют никакого отношения) Это два РАЗНЫХ продукта. Далее, по этому повду можно немного уточнить: -- OWA использует mod_plsql как свой кернел -- для конфигурирования mod_plsql в части касающейся коннекта с базой данных мы должны использовать файл --> dads.conf (Database Access Descriptor) в котором в частности ОБЯЗАННЫ объявить : --> PlsqlDatabaseConnectString - параметр в формате : host:port:sid Вопрос - а чем это собственно отличается от объявления Entry в tnsnames.ora или connection string для JDBC. Ответ --> ничем Oracle AIS для организации связи с базой действительно использует connection pool но этот connection pool по своей суте и по принципам организации работы с базой практически ничем не отличается от, например, Dynamo или Тоmcat (единственное существенное отличие - WEB Cache (но другие КОММЕРЧЕСКИЕ application сервера тоже как правило имет подобные решения) Ввиду вышесказанного следует что: схема Client<->..<->Apache<->Listener<->Data Base является неполной и должна быть: Client<->..<->Apache<->OAS9i(mod_plsql)<->Listener<->Data Base (ДЛЯ КОННЕКТА) Client<->..<->Apache<->OAS9i(mod_plsql)<->севрерный процесс<->Data Base (ДЛЯ ЗАПРОСОВ) о чем я собственно и писал выше! ВЫВОД --> ">> Togda i ne bydete gluposti pisat'!" надо относить ко всем включая в первую очередь себя самого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 02:54 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Silver: Я не понял, что значит "ключ обязан быть продублирован". Имеется в виду, что его значения могут быть неуникальными? Но тогда этот атрибут не является ключом (по определению). И если у сущности нет уникальных атрибутов, то нет и естественного ключа, и в этой ситуации без суррогатного ключа не обойтись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 08:13 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Tvoi predposylki absolutno verny dla OAS versii 4.xx. i tol'ko. Obrati vnimanie, chto pri installyazii TOLKO DB, poyavlyautsya packages serii 'OWA' i 'HTTP'. ----------- Nauka umeet mnogo gitik! ----------- I na bydyshee, ya ne dymau, chto dalee imeet smysl pikirovat'sya s toboi, Gena. Ne tot sluchai. Dla etogo protivniki dolgny byt' po krainei mere v odnoi vesovoi kategorii. -------- Ya rad tvoim poznaniyam po predydyshim versiyam Oracle . Sam ya s nim rabotau s 5 versii. Po etomy mne legche videt' ego evoluziu. Chitaite bol'she{ i na English, estestvenno . Perevody takoi fuck! } o novom, yvagaemyi, treniruites'. Vozmognosti dlya etogo est'. ------- I vse-taki, nikto ne skazal glavnogo: Kto-ge poluchil oshibky is trigger i zamedlenie v rabote? Kto poluchil sostoyanie Sequense_wait? Kto ne soglasen s tem chto :: - Seq ne MOGET v prinzipe dat' polnoi posledovatel;nosti. naprimer, v sluchae ROLLBACK schetchik nevozmogno cbrosit'. Trigger ot etih nedostatkov svoboden. -?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 08:26 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Пример с www.cnn.com совершенно не показателен - записи добавляются редко, в основном идут одни селекты, поэтому генерацию ключа можно делать практически любым, в том числе и сильно тормознутым, способом. А вот в OLTP-системе под хорошей нагрузкой вариант с max() наверянка приведет к проблемам производительности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 09:12 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
hey, anyware! kak i vezde, kagdyi connect to internet site registriryetsya. (Navernyaka) - eto ne otvet, soglasis'? Kto nibyd' rabotaet v real time { phone, cell phone, airlines etc? }? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 09:15 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
[quote] I vse-taki, nikto ne skazal glavnogo: Kto-ge poluchil oshibky is trigger i zamedlenie v rabote? Kto poluchil sostoyanie Sequense_wait? Kto ne soglasen s tem chto :: - Seq ne MOGET v prinzipe dat' polnoi posledovatel;nosti. naprimer, v sluchae ROLLBACK schetchik nevozmogno cbrosit'. Trigger ot etih nedostatkov svoboden. -?? [/quote] ну как тебе сказать.... если я правильно понял твою идею с тригером, то необходимо использовать автономные транзакции с мгновенным commit'ом после insert'a ! т.е. в этом случае есть "подобие гарантии" что номера будут последовательными (хотя автору топика этого как бы и не надо совсем...) кроме того только в этом случае будет возможна хоть какая-то многопользовательская работа, т.е. все пользователи не будут ждать одного пока он соизволит сделать COMMIT ! НО в этом случае: 1. при откате теряются номера (хотя это и не важно для автора, но чистА принципиально...) 2. существует дополнительный overhead - writing to redo log, writing to rollback/undo, что ИМХО "дороже" чем использование внутренних LATCH's при работе с SEQUENCE. в противном случае - когда ты не комитишь сразу же после получения нового ID у нас получается чудесное однопользовательское приложение !!! т.е. если у нас N активных пользователей пытающихся получить номер твоим способом, то после того как один получил его (insert отработал) и до того момента пока он не сделает commit все остальные пользователи, пытающиеся получить номер, "курят и пьют кофе"... и INITRANS им ни разу не помогает... итоги подведем: я так и не увидел ни одного преимущества подхода с использованием таблицы как источника номеров. кроме того, зачем умные дяди в Oracle Corp. ломали головы, придумывали SEQUENCEs, если можно чудно и главное оптимальнее обойтись без его использования... удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 14:48 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
Izvini, ne ponial.. автономные транзакции с мгновенным commit'ом после insert'a ! A razve cherez trigger dannye popadayt ne posle vvedenia comandy commit? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 15:32 |
|
||
|
Запутали! Как лучше автоматом формировать Primary Key?
|
|||
|---|---|---|---|
|
#18+
ну я имел в виду чуть более сложный вариант - когда из тригера вызывается процедура/функция созданная с использованием "PRAGMA AUTONOMOUS_TRANSACTION", в противном случае мы получаем "однопользовательское" приложение, объяснения смотри выше сорри, что не объяснил сразу что я имел в виду под "автономные транзакции"... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.03.2003, 15:38 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=32113712&tid=1991637]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
177ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
61ms |
get tp. blocked users: |
1ms |
| others: | 235ms |
| total: | 515ms |

| 0 / 0 |
