Ден първи

Колегата до мен се опитваше да ми каже нещо разведряващо. Само му махнах с ръка да мълчи – не мога да му обърна внимание. Твърде ужасéн съм, за да мога да водя разговор в следващите 3-4 минути.

Иначе излитането не беше лошо. Е, имал съм и по-спокойни излитания (примерно с Airbus A380 – този слон не потрепва и милиметър), но нямаше някакви инциденти. Просто не съм летял от половин година и съм забравил какво е. А ми предстоят още 3 излитания и 4 кацания за 3 дни.

Когато достигнахме нещо като полетна височина, самолета спря да се клати и аз се поуспокоих. Луфтханза правят много за комфорта на пътниците, но първите 5 минути просто трябва да се изтърпят. Какво ли не ми мина през главата – от въпроса защо 10 души от софийския офис, 2 от берлинския и 2 от лондонския ще се събираме в Берлин, до идеята да се захвана с отглеждане на овце и повече да не помириша самолет. Човек не мисли рационално при такива високи нива на стрес.

Полета да Мюнхен продължава под 2 часа. Приземяването беше спокойно, въпреки облачността. Всъщност облаците не са проблем, освен ако не е гръмотевична буря или градушка. Виж, вятъра всеки път е приключение, особено за по-малките самолети. За това и избрах полета на Луфтханза, с Еърбъс А320, макар и с прекачване в Мюнхен. България еър пишат на сайта си, че техния полет до Берлин е със един дърт самолет, който прилича на автобус с крила – Бритиш Аероспейс нещо си. Ветровете го развяват като играчка – летял съм с него до Бон
(всъщност истината за полета на България Еър се оказа друга, и се прецаках, но хайде…)

Кацнахме в Мюнхен по разписание и имахме над час до следващия полет – т.е. половин час за размонтаване. Така успях с очите си да видя, даже да докосна Maclaren MP4 12C.

Никога не бих си купил толкова адски непрактична кола.

Но с удоволствие бих я покарал :-)

Излитането от Мюнхен преживях много по-лесно. Явно големия зор е само първото излитане. С други думи, ако летя по-редовно, хич няма да се спичам. От Мюнхен до Берлин полета е 50 минути. Не знам дали изобщо стига стандартната летателна височина. Забелязал съм че самолетите на Луфтханза забавят и започват да слизат полека 30 минути преди кацане.

* * *

Летище Тегел в Берлин е като кибритена кутийка. Слизаш от самолета, минаваш десетина-двайсе метра и стигаш до таксито. Невероятно дребно е, дори в сравнение със софийското (да не говорим за Мюнхен). А най-тъпото е, че няма връзка с метро и си обречен да се бориш със задръстваниците. За щастие това летище се пенсионира на 2 юни и няма да се ползва повече. Полетите ще се преместят на ново летище, с няколко часа downtime.

Така де, ние си хванахме един лъскав мерцедес (такива са половината таксита в Берлин) да ни закара до хотел Park Inn by Radisson на Alexanderplatz (добре де, не знам как точно се пише).

Оказа се, че сме на много стратегическо за разходка място. Току до огромната телевизионна кула, молове и всякакви заведения. А, и на 700 метра от офиса. Кеф.

За съжаление нямахме много време за разходка. От 8 имахме вечеря; на другия ден в 9 трябваше да сме в офиса и се прибираме след 11 вечерта (ще разкажа за това), а след това в 9 тръгнахме към летището. Колегите, които летяха с България Еър имаха значително повече време за размотаване на третия ден.

Та така. Към 8-8:30 вечерта групата се пооформи и отидохме в някаква огромна бирария на 200 метра от хотела, където имахме резервация.

Тук е времето да напомня на любознателния читател, че аз не пия бира – просто ми е гадна на вкус. Така че докато всички други се кефеха на най-различни бири, аз се мъчех с някаква гадна вода. Освен това почти никой не отбираше немски, така че поръчахме по смелия начин „По едно от това, това, това и това“.

Все нещо ще става за ядене :)

Колегите разказаха, че са долетели с някакъв супер нов самолет. Веднага се сетих, че на скоро България Еър си купиха Ембреър 190 и се изядох от яд. Единственото ми успокоение беше, че колкото и да е нов, все пак е сравнително малък (2+2 места на ред).

Знаете ли, в Германия пушенето в закрити помещения е забранено отдавна. И заведеният не са никак празни, ама хич. Бирарията в която бяхме беше огромна – на маса 146 не бяхме в края на помещението – но пак не изглеждаше празна. Въпреки че беше едва средата на седмицата. Не знам до кога лобистите на тютюневите компании ще повтарят една и съща лъжа, че забраната за пушене в заведения ще фалира заведенията. На мен лично ще ми е по-хубаво да ходя там, когато може да се диша спокойно.

Та така, прибрахме се по тъмно. Хотела е доста висок, 37 етажа. Аз бях на 20-я (асансьора стига до него за 16 секунди, заедно с ускорението и забавянето). Веднага се сетих, че ще станат страхотни нощно снимки. После се оказа, че греша – прозорецът почти не се отваря (само малко, за проветрение). А отвън има стъклена фасада, не много чиста – не и за фотографски нужди – която вечер отразява гадната зелена светлина от близкия мол.

Ден втори

Станах рано. Имах заръка да купя едно лекарство, което не се внася в България. Обиколих всичките аптеки, които намерих, но никъде го нямаха налично. На края поръчах да ми го доставят (в ранния следобед вече е пристигнало). После се събрахме с колегите, хапнахме по някой сандвич и тръгнахме към офиса.

За работа няма какво да говоря. Ще спомена само, че обяда, който ни донесоха (в два и половина следобед, умрях си от глад!) беше някакви много вкусни сандвичи в прецели. Много вкусни и доста малко, между другото. Шефа каза, че е поръчал да доставят достатъчно за „twenty-something” (двайсе и нещо) хора, а ние бяхме 14. Гладни си и останахме.

До към пет следобед отхвърлихме работа, после започна спортната част (или, както му викаме тука, „тийм билдинг“). Дойдоха таксита и ни отведоха на невероятно забавно приключение, на име Beer Bike.

Това нещо представлява нещо като открит бар на колела, но за да се движи, всички трябва да въртят педалите. Един стои в центъра и налива бира, а екскурзовода управлява. Оказа се супер забавно.

И тук идва моята трагедия. Аз си бях оставил фотката в хотела – за какво ми е в офиса? А обиколихме супер много интересни за заснемане места из центъра. Не стига това, ами аз не пия бира. Е, казах си „ако тук не пропия, няма къде“. Насилих се, пробвах няколко пъти – ми гадно нещо си е. И срам – несрам, минах на кока кола.

Екскурзоводката беше една симпатична 19-годишна девойка, която хич я нямаше за екскурзовод. Минаваме покрай някаква интересна сграда, питам какво е – „Ами май някакъв музей“. После покрай Райхстага и около него – „Всичко тук са някакви правителствени сгради“. А иначе е местна, ама кой на 19 се интересува от местните сгради…

Друго интересно за BeerBike-a, че се движи по улицата. Много хора ни се радваха и подвикваха, японците ни снимаха. Бяхме атракция. Е, малко задръстваме движението, ама какво да правиш. Освен това озвучението ни беше супер евтин авто-CD и едни евтини, но гласовити колонки. По едно време CD-то се прецака и закачихме едно Blackberry да пее през колонките. После пък бурето с бира свърши, каката не можеше да повярва.

След няма и два часа нашата обиколка приключи където беше започнала – на паркинга Trabi world, на който освен трите BeerBike-а има десетки трабанти за разходка, няколко джогана, баркас и други интересни соц возила.

На близо има запазена част от берлинската стена

От там трябваше да се доставим до мястото за вечеря – „White Trash Fast Food”.

Част от групата решихме да използваме метро за да стигнем до там. Така успях да видя дъртия клаустрофобичен U-bahn. Стените и тавана са на една педя от влакчето!

* * *

Вечерта в White Trash Fast Food също се оказа добра идея. Обстановката е приятна, мака и доста тъмна. Храната е вкусна, макар и вредна. Опитах крем супа от аспержи – хита на сезона в Берлин. Не е кой знае какво. Поръчах си един бургер с името Big-нещо си, само заради това, че в името си има „Big“. Че след слабия обяд и въртенето на педали бях прегладнял. Е, оказа е наистина Big, едва се справих. И – о, щастие – имаше и други питиета освен бира. Аз карах на „The classic vodka fresh”, което се оказа коктейл screwdriver.

Настана вечер, към 10-11 часа, а аз и колегата, с който сме с Луфтханза, трябваше да си вземем лаптопите от офиса. Дадоха ни един ключ от офиса и хванахме такси. За втори път се убедих, че берлинските таксита са ебаси джигитите. Минава на червено, засича други коли, престроява се където свари… ужас! А, и още нещо – офиса беше сравнително близо (може би 2-3 километра), но той още в началото каза „10 евро“. И така и не пусна апарата. Абе българска работа, както би казал някой.

Та така. Помотахме се пред офис сградата. Входовете – затворени. Някакви хора си шпрехат отпред. Питахме ги как да влезем. Те от начало помислиха, че сме объркали „Ама това е офис сграда“ – „Да, знам. Трябва да влезем да вземем нещо“. „А, ОК“. Цъкнаха един звънец, и вратата се отвори. Толкоз! Някакви непознати балкански субекти – вътре! Взехме си лаптопите и си излязохме, без никой да ни каже копче…

Ден трети

Станах още по-рано, за да мога да пофотам. Взех си душ, даже и вана. Интересно дизайнерско решение: банята всъщност е в стаята, отделена с една завеска. Чувството е много странно – все едно се къпеш в хола.

Излязох, щракнах тук-таме.

Едно нещо ми направи странно впечатление: имаше някакъв голям ремонт край телевизионната кула. Камиони, багери, кал, заграждения… И от двете страни, върху тротоара/пешеходната зона, беше положен дебел слой асфалт, по който да минава строителната техника.

Към 9 тръгнахме към Тегел, с поредния авто джигит. Успя да ни откара за двайсетина минути. Там се поборих с check-in kiosk-а (неуспешно), оставих си багажа и т.н. Качихме се тъкмо навреме в доста нов Еърбъс А321. 40 минути полет и сме в Мюнхен.

Имахме малко, но достатъчно време за да се предвижим до гейт H30. Там имахме щастието да се качим на автобус и да тръгнем на панорамна обиколка на летището. Откара ни до някакво странно малко самолетче (О, ужас!). Е, не чак малко, но по-дребно от обещаното А320. Отвориха вратите на автобусчето, но ни казаха да не слизаме. И ние чакахме…

Първо дойде един наточен Мерцедес. Слязоха някакви хора, качиха се да огледат самолета. После слезе някаква важна клечка. Бахти, да стоим 50-60 човека прави в автобус, за да може някакъв галфон да се качи спокойно! После пък дофтаса бусче, от което влезе някакъв с белезници. Качиха го и него. И най-после ни пуснаха и нас.

Оказа се, че самолета е точно Ембреър 195 – същия, с който България еър прави директния полет до Белин. Демек – не спечелих от избора на Луфтанза. Нищо здраве да е. Качихме се и зачакахме да ни избутат на пистата. И чакахме, чакахме… По едно време капитана се включи по радиточката (на английски): „Уважаеми пътници, имаме забавяне, защото един пътник не се е качил, но багажа му е качен. И заради нашите строги сикюрити правила трябва да видим какво става. Тук ли е господин Дими… тров?“ (двама души вдигат ръце). „Димитров Ди…ми………тар? И Димитров Йор..дан?“ Ами и двамата са налични. Покажете документи, билети, ала-бала… В крайна сметка се оказа, че имало двама Димитър Димитров-ци и единия просто не се е явил (не е оставил и багаж). Нямат ли сурогатни ключове тия, че идентифицират багажа по името на пътника?

И понеже бяха свалили всички багаж, после да го качат, си направихме почти час закъснение. През което време аз треперих как ще се справи тя вейка с ветровете. Оказа се, че се справя добре.

По средата на полета отидох на последната седалка и започнах да фотам.

На края бях толкова уверен, че снимах десетина минути видео – приземяването: от високо в небето, покрай някои много готини облаци, над централна гара, до самата писта. За съжаление поради двойния VR на обектива (Nikkor 28-300), и още един от ръката, така и не се вижда как яко се огъват бразилските крила.

Снимки може да кача след ден-два.

 

Всичко започна с купуването на нов килим. Хубав, мек, неутрални цветове, уж да не се цапа видимо. От светло бежово, през различни кафяви, до черно:

Кой да предположи, че румбата (iRobot Roomba 564 Pet) не обича черното? Пуснахме я да го почисти, тя се разхожда само по широчина и не смее да пресече черните линии. Фиър ъф дъ дарк, дееба.

Започнах с почистване, четки, датчици, ала-бала. Не помогна. Хвърлих едно око в гугъл и намерих това. Историята е следната – има 4 датчика, които гледат да не се изсули от някое стъпало. Всеки от тях има инфрачервен светодиод, който „свети“, и един приемник, който приема отразената светлина. Ако няма светлина – значи има дупка. И румбата обръща.

Обаче черното по нашия килим се оказа твърде черно и не отразява светлината. Описания в горната статия workaround не работи, защото при 564 трансмитера и рисйвъра са в две отделни камерки. Пробвах да залепям изолирбанд, бяло тиксо, даже алуминиево фолио – нъц. В момента в който я пусна, веднага реве „Error 1. Move roomba to a new location, then press CLEAN to restart“
(абе ако си бях поиграл с фолиото, можеше и да направя някакъв „светловод“, който да работи, ама ще е нестабилен)

И така, порових още малко и попаднах на следните „42 лесни стъпки за шунтиране на сензорите за стъпало„. Disclaimer: в резултат на това румбата няма да усеща дупките и може да пада от високо; но у дома стъпала няма, подът е равен. Упътванията са доста ясни, не се прави нищо деструктивно като чупене, рязане, пробиване, разпояване/запояване. Но си трябва смелост за да се направят (и инженерен дух, хехе). Пък и сигурно се губи гаранцията.

И така, ето я моята румба на операционната маса:

Ето как залепих и четирите датчика:

Честно, в повечето случаи не бих се заел с такъв ремонт. Не знам какво ми става днес. Още от нощес ме държи авантюризма. Направо ме е страх да си пусна VPN-а – да не взема да upgrade-на някоя production база.

А най-странното е, че след като завих всички болтчета, всичко си тръгна от раз. Ефекта на затворената кутия го нямаше!

И сега, румба си мете килима. Датчика за блозост до обект си работи (забавя преди да се буторяса някъде); датчика за докинг станцията също не съм го преебал.

Ура!

 

Изглежда че работи.

Пробвах да я инсталирам през iTunes, тегли я маса време (6-7 минути) и на края каза нещо за майка ми. Отговорих му подобаващо и – мечка страх, мен не страх – го пуснах направо от iPad-а. Мина за, хммм, около 10 минути, абе от раз.

Пощата ми работи (Exchange), другите най-използвани от мен приложения (Thinking Rock и Notes) – тоже. Calendar, Da Dictionary, Discover, както и разни игрици не се оплакват.

Абе слагайте. Уж някакви проблеми с батерията оправя. Не че се оплаквам, държеше си доволно…

 

Имаме следната задача: Table1 съдържа имена на клиентите на най-голямата квартална бакалия в Мюнхен, а Table2 съдържа феновете на Байерн Мюнхен. Пита се колко от феновете на Байерн пазаруват в бакалията.
Да предположим, че данните са First Name (FNAME), Last Name (LNAME), CITY, COUNTRY.

Най-елементарното решение е следното:

select *

  from table2 t2

 where exists (select 1

          from table1 t1

         where t1.fname = t2.fname

           and t1.lname = t2.lname

           and t1.city = t2.city

           and t1.country = t2.country)

Това ще ни даде резултат ако всички имена са написани по паспорт. Но както всички знаем, данните не винаги са така чисти. Примерно господин Schmitt от феновете може да е записан в бакалията като Schmidt; госпожица Pavlovich може да е Pavlovic; John Smith не съвпада с John Smit и т.н. Абе трябва нещо по-добро.

Има една функция, което се опитва да оцени звуковото съответствие (работи само за латиница!) и това е soundex. Начина и на действие е относително прост и е описан тук. Да видим какво става с нея:

select *

  from table2 t2

 where exists (select 1

          from table1 t1

         where soundex(t1.fname) = soundex(t2.fname)

           and soundex(t1.lname) = soundex(t2.lname)

           and t1.city = t2.city

           and t1.country = t2.country)

(за простота, или от простотия, приемам че държавите и градовете са написани еднакво. Иначе може да се приложи същата трансформация)

Опа… излязоха твърде много резултати. За мен няма нищо общо между Marko Mjagkov и Marica Moisejevs, но на soundex му звучат еднакво – M620 M221. Да опитаме нещо друго

Има едни красив, относително нов пакет, известен като utl_match. В този пакет има реализирани 2 алгоритъма, разработени за борба с точно такъв проблем – сравняване на имена. Единият е измислен от руския математик Владимир Левенщайн през далечната 1965 (функцията EDIT_DISTANCE), а другия комай е с американски произход, резултат от дългогодишния труд на господата Matthew Jaro и William Winkler, публикуван през 1990. Колкото и да бях добър с математиката като ученик и студент, сега съм забравил всичко и математическия апарат ми е твърде сложен; но пък мога да използвам функциите наготово и без да му мисля много, да проверя колко са „близки“ имената:

select *

  from table2 t2

 where exists (select 1

          from table1 t1

         where utl_match.jaro_winkler(t1.fname, t2.fname) > 0.9

           and utl_match.jaro_winkler(t1.lname, t2.lname) > 0.9

           and t1.city = t2.city

           and t1.country = t2.country)

Тук, обаче, достигам до друг проблем – няма ефективен начин а ускоря заявката. Ако бакалията има 10 000 клиенти от Мюнхен, а Байерн има 500 000 фена в родния си град, то имаме реален шанс да изпълним функцията utl_match.jaro_winkler над 5 000 000 000 пъти. При това ще сравнява, примерно, Адолф с Грета – нищо общо. Никакви индекси или оптимизации не помагат, просто груба сила. Това си отнема доста (процесорно) време.

И така, за нуждите на моето изследване аз достигнах до следното комбинирано решение

select *

  from table2 t2

 where exists (select 1

          from table1 t1

         where soundex(t1.fname) = soundex(t2.fname)

           and soundex(t1.lname) = soundex(t2.lname)

           and utl_match.jaro_winkler(t1.fname, t2.fname) > 0.9

           and utl_match.jaro_winkler(t1.lname, t2.lname) > 0.9

           and t1.city = t2.city

           and t1.country = t2.country)

Тук със soundex сравнението орязвам значително проверките, макар и да имаме доста false positives. За по-извратени случаи може да направим функционален индекс по soundex.
После с utl_match.jaro_winkler намирам най-вероятните съвпадения от вече намаления набор. Вярвате или не, това върви доста добре – при таблици с 20К и 2M реда (всичките от един град), минава за десетки секунди и дава доста смислени резултати. Разбира се, доста от съвпаденията може да са случайни – не само един мюнхенец се казва Ханс Шмит. Но все пак е някакво начало.

P.S. По време на research-а попаднахме на многообещаващия Петьо. Отказахме се от него, защото иска extproc, а ние избягваме този механизъм защото може да отвори дупка в сигурността. Иначе изглежда прекрасно

 

Презентацията ми „The adventure of upgrading to 11.2″ от есенния семинар на БГПО в Хисар – тук

Отново изразявам моите огромни благодарности и възхищение на Милена, СПИ и другите организатори, които инвестират много от личното си време и енергия за да направят тези семинари. Страхотна работа, отново!

 

Това е една друга интересна мотика при upgrade от 10g на 11g. По време на автоматизираните тестове забелязахме, че audit trail таблицата се раздува с бясна скорост и една забележима част от IO операциите са именно писане в SYS.AUD$.

Открихме следната нота в Metalink:
Huge/Large/Excessive Number Of Audit Records Are Being Generated In The Database [ID 1171314.1]

1.) Starting with Oracle 11g the BY SESSION clause is obsolete. This is documented in the Database Security Guide :

“ The BY SESSION clause of the AUDIT statement now writes one audit record for every audited event. In previous releases, BY SESSION wrote one audit record for all SQL statements or operations of the same type that were executed on the same schema objects in the same user session. Now, both BY SESSION and BY ACCESS write one audit record for each audit operation. In addition, there are separate audit records for LOGON and LOGOFF events. “

Because of the above change it is expected that the number of the audit records/files will grow considerably.

Засилвайки се към документацията открих следното:
Oracle® Database SQL Language Reference 11g Release 1 (11.1)

BY SESSION

In earlier releases, BY SESSION caused the database to write a single record for all SQL statements or operations of the same type executed on the same schema objects in the same session. Beginning with this release of Oracle Database, both BY SESSION and BY ACCESS cause Oracle Database to write one audit record for each audited statement and operation. BY SESSION continues to populate different values to the audit trail compared with BY ACCESS. If you specify neither clause, then BY SESSION is the default.

На практика същото пише и в Oracle® Database SQL Language Reference 11g Release 2 (11.2)

Още по-неясно е написаното в Oracle® Database Security Guide 11g Release 2 (11.2)

Benefits of Using the BY ACCESS Clause in the AUDIT Statement

By default, Oracle Database writes a new audit record for every audited event, using the BY ACCESS clause functionality. To use this functionality, either include BY ACCESS in the AUDIT statement, or if you want, you can omit it because it is the default. (As of Oracle Database 11g Release 2 (11.2.0.2), the BY ACCESS clause is the default setting.)

Oracle recommends that you audit BY ACCESS and not BY SESSION in your AUDIT statements. The benefits of using the BY ACCESS clause in the AUDIT statement are as follows:

Честно ви казвам, тия неща ми звучат като „Ъъъъ… бе нещо се повреди тоя BY SESSION, ама успяхме да го позакрепим, макар че вече работи почти като BY ACCESS“

Трябваше да предефинираме audit политиката си преди upgrade-a. За щастие повечето noaudit операции стават online. Единствено noaudit execute прави гадни заключвания и трябваше да го правим по време на downtime.

Ето и едно полезно query по въпроса:

select 'noaudit select on ' || owner || '.' || object_name || ' WHENEVER SUCCESSFUL;'
  from DBA_OBJ_AUDIT_OPTS
 where sel like 'S/%'
   and owner in ('...application schemas...')
   and object_name not in ('...exclusions...')
union all
select 'noaudit execute on ' || owner || '.' || object_name || ' WHENEVER SUCCESSFUL;'
  from DBA_OBJ_AUDIT_OPTS
 where exe like 'S/%'
   and owner in ('...application schemas...')
   and object_name not in ('...exclusions...')
union all
select 'noaudit update on ' || owner || '.' || object_name || ' WHENEVER SUCCESSFUL;'
  from DBA_OBJ_AUDIT_OPTS
 where upd like 'S/%'
   and owner in ('...application schemas...')
   and object_name not in ('...exclusions...')
union all
select 'noaudit insert on ' || owner || '.' || object_name || ' WHENEVER SUCCESSFUL;'
  from DBA_OBJ_AUDIT_OPTS
 where ins like 'S/%'
   and owner in ('...application schemas...')
   and object_name not in ('...exclusions...')
union all
select 'noaudit delete on ' || owner || '.' || object_name || ' WHENEVER SUCCESSFUL;'
  from DBA_OBJ_AUDIT_OPTS
 where del like 'S/%'
   and owner in ('...application schemas...')
   and object_name not in ('...exclusions...')

И още нещо много важно: не забравяйте да си прегледате какво пише в ALL_DEF_AUDIT_OPTS преди upgrade. Иначе catupgrd ще ви създаде хиляда хиляди обекта с кофти auditing.

 

Това не го очаквах. Обикновено с новите версии на Oracle нещата скалират по-добре; има по-малко заключваници от предишните версии. Това, което ще опиша, е ново за 11g

Някой би казал, че това е некадърен дизайн на приложението. Всеки знае, че foreign key колоните трябва да се индексират. Обаче в 10g това водеше до по-бавно изтриване от parent таблицата, или по-бавен update на primary key в нея (докато се сканира child таблицата за съответни записи). А сега имаме изцяло ново поведение – заключване, което може да продължи произволно дълго време. Един прост INSERT в parent таблицата може да блокира всички други сесии, които се опитват да направят UPDATE или DELETE (пак на parent таблицата). Тук изобщо не говорим за промяна в child таблицата – достатъчно е да я има, ако ще и празна. И за да ни е по-весело, ние настъпахме тая мотика с child таблица от 724 реда, на която full scan-а в 10g е минавал светкавично и не сме усетили никакъв проблем.

* * *

Ето и подробностите. Note 1343365.1 казва следното

There is change in lock modes behavior introduced intentionally by fix 5909305 in 11.1 onward.

Change has been made to DML (TM) lock modes for foreign key constraints (Doc ID 5909305.8).

The change in behavior mentioned in note 5909305.8 , introduces higher level of lock on parent table while running DML against Child table. ( SX vs SS )

There are cases unrelated to this bug which lack of indexes on foreign key columns increase the time locks take place. This reflect as wait on TM-enq.

Звучи безобидно. Поведението на SS и SX е почти еднакво. Има 2 разлики – SX не е съвместим с други S и SSX (Share и Share Sub-eXclusive) заключвания. Но тия двете не се срещат в ежедневната работа с DML заявки. Почти.

Тук се включва неиндексирания foreign key. Това е единствения DML за който знам, който прави S заключване на цялата child таблица. И така, със следните прости стъпки аз успявам да се заключа всеки път на 11.2.0.2:

1. Подготвям си таблици и данни

drop table t2 purge;
drop table t1 purge;

create table t1 (pk number primary key);

create table t2 (pk number primary key, fk number references t1(pk));

insert into t1 values (1);
insert into t1 values (2);
insert into t1 values (3);
insert into t1 values (4);

insert into t2 values (11, 1);
insert into t2 values (21, 2);
insert into t2 values (22, 2);
insert into t2 values (31, 3);
insert into t2 values (32, 3);
insert into t2 values (33, 3);

commit;

2. Залагам капана от сесия 1

insert into t1 values (5);

Кратък поглед във v$lock показва, че нашата сесия 1 държи 3 заключваници (всъщност малко повече в 11g, но трите са най-интересни)
- mode 6 (eXclusive) TX lock върху новия ред
- mode 3 (Sub eXclusive) TM lock върху таблицата t1 (демек parent таблицата). обърнете внимание, че това е заключване на таблицата, а не на някой ред в нея
- mode 2 (Sub Share) при 10g или Mode 3 (Sub eXclusive) при 11g, TM lock на таблица t2 (това е child таблицата). Отново това не е свързано с никакви редове в нея – може да има, може и да няма засегнати редове. Такива заключвания има за всички таблици, които имат foreign key constraint, сочещ към нашия parent.

3. Опитваме да променим или изтрием произволен (друг) ред от parent таблицата от сесия 2:

delete from t1 where pk=4;

или

 update t1 set pk=2 where pk=2;

В 10g това минава безгрижно. Обаче в 11g и двете зависват, опитвайки се да получат Mode 4 (Share) lock на child таблицата – защото foreign key колоната не е индексирана.

Как да си намерим неиндексираната таблица:
FВсъщност аз забелязвам сесиите, чакащи за TM locks в Grid Control. Там излизат едни червени неща, лесно се виждат. Може да ги видим и във V$SESSION:

 SQL> select sid, final_blocking_session
  2    from v$session
  3   where event = 'enq: TM - contention';

       SID FINAL_BLOCKING_SESSION
---------- ----------------------
       132                    332

За да намерим проблемния ресурс (с други думи – таблицата без индекс), пускаме това:

 SQL> select SID, type, id1, lmode, request, block
  2    from v$lock
  3   where sid in (132, 332)
  4     and type = 'TM';

       SID TYPE        ID1      LMODE    REQUEST      BLOCK
---------- ---- ---------- ---------- ---------- ----------
       132 TM       950744          3          0          0
       132 TM       950746          0          4          0
       332 TM       950744          3          0          0
       332 TM       950746          3          0          1

На ред номер 4 пише BLOCK=1, т.е. това заключване *блокира* някой друг. На ред номер 2 виждаме REQUEST=4 и LMODE=0 – това показва, че сесията има нужда от mode 4 lock, обаче не може да се уреди. Колоната ID1 в случая е object ID (за TM locks):

 SQL> select owner, object_name, object_type
  2    from dba_objects
  3   where object_id = 950746;

OWNER      OBJECT_NAM OBJECT_TYPE
---------- ---------- -------------------
YAVOR      T2         TABLE

Решението е лесно, след като сме открили проблема. Просто създаваме индекс на foreign key колоната от child таблицата

 create index t2_fk on t2(fk);

След създаването на индекс, промяната върху parent таблицата вече не прави S заключване на child. Вместо това се прави SX заключване, което е съвсем съвместимо с другия SX.

Това поведение е трудно за обяснение на develpers. Честно казано, дори и аз не мога да си обясня как индекса премахва нуждата от S lock и го намаля на SX. Ние не засягаме никакви редове в child таблицата. Ама… така са го направили.

 

Interestingly, all media are making great efforts not to mention the names of parties and candidates. But around the blogosphere every other post, or even more often, is political – „I voted for this and that, because this and that“ . Which, from a legal point of view, is propaganda.
Blogs go for something like an informal media. I wonder how it could this be defined in the election code.
I voted. And if I’d agitate for something, that is – vote! If nothing else, the valid vote is the most effective „protest vote“ against vote buying. Which, we all agree, sucks.

 

Интересно, всички медии полагат огромни усилия да не споменават имена на партии и кандидати. А из блогосферата всеки втори постинг, да не е и по-често, е политически – „Аз гласувах за този и този, защото това и онова“. Което, от правна гледна точка, си е агитация.
Блоговете минават за нещо като неофициална медия. Интересно как би могло да се дефинира това в изборния кодекс.
Иначе и аз гласувах. И ако ще агитирам за нещо, това е – гласувайте! Ако не друго, валидния глас е най-ефективния „протестен вот“ срещу купуването на гласове. Което, всички сме съгласни, е гадно.

 

В петък се излежавах до около 8 часа. После хапнах за последно от континенталната закуска и тръгнах да си събирам багажа. Много предизвикателна задача: от подаръци и сувенири куфара се напълни около 2 пъти. Започнах да го затварям от едната страна и да натъпквам дрехите към нея; после още малко напред с ципа, още дрехи натъпкани и така. Процедурата сработи, справих се за около час (с почистването на стаята), но остана малкото притеснение да не ме накарат да си отварям багажа на летището, че после няма прибиране. А не е като да няма съмнителни (като за рентген) неща вътре – стъклена бутилка, един голям обектив, дезодорант, ел. четка за зъби и самобръсначка и т.н.
(всъщност когато дрехите престоят няколко часа в куфара се смачкват до толкова, че едно отваряне за малко не е проблем)

После освободих стаята – така или иначе трябва да се изнесеш до 12 – и оставих куфара на рецепцията. Реших да използвам няколкото свободни часа с фото-разходка из центъра. Имах и още няколко подаръка за купуване, както и една от най-важните задачи: да си намеря ракиена чашка с надпис San Francisco.

И така, няколко снимки от Сан Франциско. Ето една типична баир-улица:

На всички по-големи улици има надписи кога се мият:

Гадната миризма, от която се оплаках в неделя, не се повтори. Но е истина и че всяка нощ валеше.

Ето Union Square:

Забележете горе вдясно панорамните асансьори. Сигурни е много готино да се возиш в тях.

Тези туристически автобуси за разходка тръгват от Union Square. Два са пълни, има опашка за следващия. И като става дума за опашка, вижте какво чакане е да се повозиш на cable car:

Трамвайчето стои разтоварено малко преди обръщалото. Опашката започва вдясно, минава покрай „обръщалото“ и завършва вляво, където е качването. Но всяко трамвайче има ограничен капацитет:

Следваща тема: анти-грипни ваксини. Масова рекламна кампания. Вероятни са спонсорирани от държавата и са далавера, защото всяка по-смислена аптека предлага даже да ви ги бият на място:

Ето и снимка на Yerba Buena gardens. Вляво се вижда един много впечатляващ хотел – Marriott. Доста етажи – поне 30, интересна архитектура и много конферентни зали и стаи – част от сесиите бяха в него.

В средата пък се вижда католическата църква свети Патрик. Ето я и вътре:

Да е жив и здрав никоня, с това високо ISO. Позволих си да направя няколко снимки, защото нямам нужда от светкавица. Ето и детайл от фасадата:

А това е еврейски музей, според надписа:

Много интересна архитектура. И непрактична, ама това май е второстепенно в случая.

И така, обикалям вече над 2 часа, а не намирам сувенирен магазин с ракиени чашки. А аз много държах да си купя, колекционирам ги – имам от 15-20 различни градове из целия свят. Но не щеш ли, изведнъж попадам в някакъв China Town:

Още първото магазинче имаше каквото ми трябва. Продавачите бяха двама латинос, шляпаха на испански. Купих си чашка, а те забелязаха никоня на врата ми и взеха да ме зарибяват с обективи. Цените бяха прекрасни – 600 долара за Nikkor 10-24 (в БГ е 1500 лв). Не посмях да си го взема, де – тази цена беше направо съмнителна. Пък и ако му стане нещо, после ходи търси гаранция.

И така. После се видяхме с Юлиян Дончев за последна раздумка. Той тръгна за летището в към 13:15, за полет в 18 часа. Аз излитах в 21, така че реших да не се поотвам дълго. Обядвах за последно в „американския“ ресторант, прибрах си багажа и тръгнах към BART.

От летището не може да сбъркаш влака – там е само един. Обаче през града минават поне 4-5, така че на „гарата“ попитах кой точно ми трябва. Казаха ми да се кача на тоя, на който пише „San Francisco Airport“. Логично.

Стоварих се на международния терминал към 15:30. Там установих, check in-а на луфтханза работи от 17:45. Куца хава. Ама аз си имам книжка, седалки много – изчаках. Чекирах си багажа към 18:00 часа – същата процедура като тук. Никой не го гледа. Сетих се, че може проверката да е по-нататък. Един приятел са го викнали от гейта за да си отвори чантата, че има нещо съмнително (бутилка Каменица) ама това е в Европа – американците са много по-параноични.

Security check-а на ръчния багаж започва с дълга, но бърза опашка. Сравняват ти старателно снимката с лицето, да не е нещо менте; после задължително се събуваш – обувките минават през скенера за ръчен багаж. Интересното е, че мен не ме пуснаха през машината за преглед „на голо“ – минах само през метален детектор. После си взех обувките и ръчния багаж и газ към duty free-to.

Много исках да занеса бутилка калифорнийско вино. Даже взех две. Обаче като отидох на касата ми казаха, че ще имам проблеми в Мюнхен заради прекачването. И с всичкия си акъл аз се вързах и не взех вино. Пълна глупост – при прекачване (поне в Европа) не се минават никакви проверки.

Ето опит за снимка с относително дълга експозиция, от ръка

Да е жив и здрав VR-а.

Та седя си аз на гейта и си чета. Постепенно се събират все повече хора. И в един момент се чува дългоочаквания повик:
„Passenger Ivanov, please identify yourself at gate G99″
Оф, ще трябва да отварям куфара… Да, ама не – оказа се, че само искали да ми сменят мястото. Няма проблеми, стига да съм до коридора, че ставам често.

Airbus A340-600 май е самолета с най-дългия фюзелаж. Събира до 440 пътника, при това е само на един етаж. Интересното (за мен) решение е, че тоалетните са на „долния етаж“ – така има повече седалки за сметка на по-малко багажно отделение. А се получава и интересно разнообразие – има място, на което може да си повисиш когато ти е тъпо на седалката (има ограничение – до 10 човека – защото там има само толкова кислородни маски). Та на това местенце оставят вафлички, сокчета, вода, кола и т.н.

Ето как boot-ва личната система за забавление:

Windows CE. Интерфейса е подобен на тоя на A380, но резолюцията е по-лоша. Е, все пак и самолета е по-възрастен.

Излетяхме с малко закъснение – може би 10-20 минути. Полета до Мюнхен е по-кратък (около 10 часа и половина), хем Мюнхен е половин час по-далеч от Франкфурт. Забелязах, обаче, че не минахме минахме толкова северно – от Гренландия захапахме само най-южния край, после доста южно от Исландия и влязохме над Шотландия (а не над Норвегия). Освен това през цялото време летяхме с над 950 км/ч, даже често над 1000. Над Холандия прелетяхме с 1070.

Отново имаше 2 ястия – грубо казано два часа след излитане и два часа преди кацане. През повечето време всички спаха, всички прозорци бяха затворени, светлините – угасени. Дори и аз, с всичкия ми страх от летене, поспах 4 часа.

В Мюнхен се приземихме при дъжда, даже и град. Големия самолет мина леко през облаците и се приземи без да изпитвам ужас. Но имах недалновидността а се обадя до България и да разбера, че и в София времето е гадно.

Ето един интересен детайл от терминала в Мюнхен:

Затворени стъклени стаи, пълни с пушачи, които седят вътре като наказани. Всяка от тях – брандирана (и вероятно мощно спонсорирана) от различен производител на тютюневи изделия.

Още нещо интересно:

Абе то на тоя малък размер не се вижда, обаче на тази снимка има 6 (шест!) самолета, които кацат на 2 писти. Интервала между кацанията е под минута. Е това е казва трафик! И така беше през доста дълъг период от време (докато гледах).

2 часа почивка и отново време за boarding. Обаче вече не сме в голяма машина – вече сме второстепенна дестинация. Което означавам че излязохме от терминала и се качихме на автобус. Той обикаля, обикаля, и ни закара до един A319-100. Не че е лиша машината – даже е прекрасна. Обаче аз идвам от нещо много по-голямо и се чувствах като в лагерница. Прибавете и лошото време.

Обаче пилота беше майстор. Това беше толкова меко кацане, че ми идваше да го разцелувам. Разбира се, бях изтощен – излетях в петък вече и кацнах в събота около 22:20 (-10 часа разлика).

Чак вкъщи установих, че куфара ми всъщност наистина се е оказал съмнителен. Забелязах разместените ципове. Вътре открих и бележка (някаква стандартна бланка) – по закон еди-кой-си, ала бала, отворихме вашия багаж. Ако е имало ключалки, може да са били разбити, за което се извиняваме. Аз имам ключалки, но не го бях употребил. Благодаря на Илиян, той ми каза още преди години „Не си заключвай багажа. Ако искат да го отворят – ще го отворят“. Е, сега го видях и официално написано.

Чувствам се добре в България!

© 2012 Master Yavor from Tryavna Suffusion theme by Sayontan Sinha