db2 -klucze obce optymalizacja zapytan i inne
Janusz M - 04-07-2007 00:01
db2 -klucze obce optymalizacja zapytan i inne
Witam,
Jestem w trakcie przenoszenia aplikacji z bazy Firebird do DB2 express -C (9.1.2) i w związku z tym wyszlo pare zapytan.
1. jak zauważyłem DB2 nie trakuje kluczy obcych w tabelach jako indeksow i do wiekszosci zapytan ich nie uzywa. Musialem podefiniowac dodatkowe indeksy w tabelach takie same jak klucze obce. W dokumentacji jest ze jak dam w definicji klucza obcego ENABLE QUERY OPIMIZATION to bedzie on uzywany do optymalizacji zapytan, ale to nie dziala (odswierzone wszystkie statystyki w tabeli) . Moze potrzebne jest ustawienie jakiegos parametru w bazie danych ?.
2. Zrobilem sobie backup online bazy danych z opcja INCLUDE LOGS, potem odtworzylem ja a potem zawarte w niej logi do innego katalogu. Niestety przy probie odtworzenia logow prosi o dalsze logi, nie wystarczaja te ktore byly dolaczone do backupu. Czy ta opcja wogole działa ?. Backup online bez logow i odtwarzenie pozniej z zarchiwizowanych logow dziala ok.
3. Po poprawie kilku finkcji zdefiniowanych przeze mnie w bazie, przestaly dzialac procedury ktore je uzywaja. Po grzebaniu w necie i bazie zobaczylem ze pakiety wygenerowane z tych procedur przeszly w stan inoperate, trzeba bylo zrobic rebind tych pakietow. Czy jest jakas opcja w ustawieniach albo jakas wbudowana procedura zeby to robic automatycznie. ( swoja droga dziwne ze tego nie robi od razu db2, po zmianach w procedurach).
4. Czy wersja 9.1 DB2 jest na tyle stabilna ze mozna ja uzywac w serwerach produkcyjnych. U mnie czasem sa jakies dziwne rzeczy. Np po dodaniu indeksow , zrobienia statystyk i rekompilacji procedur dalej nie uzywaja one nowych indeksow, pomaga na przyklad, usuniecie indeksu, zrobienie go od nowa, uzycie w programie (C# ) nazwy procedury bez poprzedzenia jej nazwa schematu powoduje zamkniecie instancji db2, dwa razy zdarzylo mi sie przy zmianie definicji view ( drop i pozniej create) , ze instancja sie zawiesila, trzeba bylo resetowac. Dodam ze pracuje na windows xp profesionnal i windows 2003 serwer.
5. Czy jest jakies narzedzie ( moze byc komercyjne) do administracji i programowania DB2. Centrum sterowania IBM i Developer Workbench są delikatnie mowiac takie sobie, a Toad for DB2 to juz porazka.
pozdrawiam,
Janusz
Artur - 04-07-2007 00:01
> 3. Po poprawie kilku finkcji zdefiniowanych przeze mnie w bazie, przestaly > dzialac procedury ktore je uzywaja. > Po grzebaniu w necie i bazie zobaczylem ze pakiety wygenerowane z tych > procedur przeszly w stan > inoperate, trzeba bylo zrobic rebind tych pakietow. Czy jest jakas opcja w > ustawieniach albo jakas wbudowana procedura > zeby to robic automatycznie. ( swoja droga dziwne ze tego nie robi od razu > db2, po zmianach w procedurach).
Po usunięciu funkcji pakiety procedur trzeba przekompilować świadomie. Można przygotować skrypt, który to zautomatyzuje, ale na razie nie ma możliwości domyślnej rekompilacji pakietów. Wyjaśnienie na temat pakietów w DB2 poniżej.
-- Artur Wroński
Skompilowany kod oraz opcjonalnie kod źródłowy procedury przechowywany jest w systemowym słowniku bazy danych. W bazie także tworzony jest pakiet, w którym osobno przechowywane są statyczne polecenia SQL oraz plany wykonania tych instrukcji (skompilowane instrukcje SQL). Statyczny SQL, to taki, którego postać jest znana w trakcie tworzenia aplikacji. Pakiet zawiera także wiele innych ustawień, np. domyślny poziom optymalizacji, poziom izolacji, domyślny format daty, czy ustawienie pozwalające na generowanie planów wykonania zapytań.
W momencie wykonywania procedury, która korzysta z pakietu zamiast kompilować instrukcje SQL w locie, baza danych sięga po gotowy plan dostępu z pakietu, który jest skojarzony z programem procedurą. Pakiety tworzone są dla procedur składowanych w SQL, ale także programów napisanych w ESQL/C (zagnieżdżony SQL w języku C) oraz dla programów Java napisanych w SQLJ.
Jeśli zostanie zmieniona struktura bazy, z których korzystają procedury, wtedy instrukcje SQL zawarte w pakiecie procedury wymagają powtórnego przekompilowania, czyli odpowiedni pakiet powinien zostać poddany operacji powtórnego wiązania (REBIND).
Jeśli pakiet wymaga powtórnej kompilacji oznaczany jest jako INVALID albo INOPERATIVE. Odpowiednie zapytanie na widoku słownika systemowego pozwoli wyświetlić pakiety, które nie są ważne:
SELECT PKGSCHEMA,PKGNAME,VALID FROM SYSCAT.PACKAGES WHERE VALID <> 'Y'
Pakiet procedury może przyjąć stan INVALID na przykład w sytuacji, gdy w ciele procedury jest wywołanie innej procedury, która została usunięta. Powtórne utworzenie zagnieżdżonej procedury spowoduje automatyczną rekompilację pakietu procedury nadrzędnej (w momencie uruchomienia procedury nadrzędnej).
Wprowadzenie pakietu w stan INOPERATIVE oznacza, że zmiany zewnętrzne były na tyle gruntowne, że powtórna rekompilacja może wpłynąćna zmianę działania danej procedury. Rekompilacja pakietu procedury może być przeprowadzona w dwóch odmianach: RESOLVE ANY oraz RESOLVE CONSEVATIVE. RESOLVE CONSEVATIVE dokonuje powtórnego wiązania pakietu z uwzględnieniem zachowanego wcześniej kontekstu pakietu. Przykładowo, jeśli w ciele procedury jest zapytanie SELECT * FROM tabela, a tabela zostanie rozszerzona o dodatkową kolumnę, wtedy tryb CONSEVATIVE zachowa poprzednią listę kolumn, a tryb ANY uwzględni nową definicję tabeli.
Usunięcie funkcji zdefiniowanej przez użytkownika powoduje, że pakiety procedur są automatycznie wprowadzane w tryb INOPERATIVE i wymagają jawnego powtórnego wiązania pakietu w trybie ANY. Wynika to ze specyfiki funkcji (np. możliwość przeciążeń danej funkcji, ścieżka PATH określająca kolejność wyszukiwania funkcji w różnych schematach), które stają się częścią instrukcji SQL.
Pakiet danej procedury można powtórnie przekompilować poleceniem REBIND podając nazwę pakietu, np:
db2 rebind DB2ADMIN.P1095817 resolve any
Pakiety procedury można także przekompilować następującym wywołaniem podając nazwę procedury:
db2 call REBIND_ROUTINE_PACKAGE('P', 'DB2ADMIN.PR2', 'ANY')
Artur - 04-07-2007 00:01
> 2. Zrobilem sobie backup online bazy danych z opcja INCLUDE LOGS, potem > odtworzylem ja a potem zawarte w niej logi do innego katalogu. Niestety > przy probie odtworzenia logow > prosi o dalsze logi, nie wystarczaja te ktore byly dolaczone do backupu. Czy > ta opcja > wogole działa ?. > Backup online bez logow i odtwarzenie pozniej z zarchiwizowanych logow > dziala ok.
> 2. Zrobilem sobie backup online bazy danych z opcja INCLUDE LOGS, potem > odtworzylem ja a potem zawarte w niej logi do innego katalogu. Niestety > przy probie odtworzenia logow > prosi o dalsze logi, nie wystarczaja te ktore byly dolaczone do backupu. Czy > ta opcja > wogole działa ?. > Backup online bez logow i odtwarzenie pozniej z zarchiwizowanych logow > dziala ok. >
Ta opcja działa.
Do odtworzenia backupu online potrzebujesz 1. obraz archiwum i 2. pliki dziennika tranksakcji (logi).
Opcja Include Logs dołącza aktywne logi do archiwum (redundancja), tak by można było odtworzyć bazę bez konieczności sięgania do oryginalnego archiwum logów.
Pliki dziennika są potrzebne ponieważ obraz archiwum zawiera niespójny stan bazy danych -- migawkę systemu, w którym część transakcji nie było jeszcze zatwierdzonych. Logi będą potrzebne do odwinięcia transakcji, aktywnych w momencie wykonywania archiwum. Ale, logi mogą posłużyć także do powtórzenia transakcji, tak by odtworzyć system na późniejszy punkt w czasie.
Jeśli chcesz zaprzestać dogrywania kolejnych logów a więc udostępnić bazę do pracy musisz podać opcję COMPLETE polecenia ROLLFORWARD.
db2 ROLLFORWARD DB BAZA1 COMPLETE
ewentualnie możesz podać także ścieżkę do logów, jeśli znajdują się w miejscu innym niż oryginalne archiwum logów (w pliku historii bazy jest informacja, gdzie logi były archiwowane):
db2 ROLLFORWARD DB BAZA1 COMPLETE OVERFLOW LOG PATH ('ścieżka')
Jeśli zrobisz coś takiego: db2 ROLLFORWARD DB BAZA1 OVERFLOW LOG PATH ('ścieżka')
czyli bez klauzuli COMPLETE, wtedy baza powtórzy transakcje, ale dalej będzie w stanie oczekiwania na dogranie kolejnych logów (taką operację można powtarzać w nieskończoność).
Jeśli to nie pomogło, podaj jakie instrukcje wywołujesz.
-- Artur Wroński
Janusz M - 04-07-2007 00:01
> 2. Zrobilem sobie backup online bazy danych z opcja INCLUDE LOGS, potem > odtworzylem ja a potem zawarte w niej logi do innego katalogu. Niestety > przy probie odtworzenia logow > prosi o dalsze logi, nie wystarczaja te ktore byly dolaczone do backupu. > Czy > ta opcja > wogole działa ?. > Backup online bez logow i odtwarzenie pozniej z zarchiwizowanych logow > dziala ok. >
Ta opcja działa.
Do odtworzenia backupu online potrzebujesz 1. obraz archiwum i 2. pliki dziennika tranksakcji (logi).
.......
Wielkie dzieki za wyczerpujace wyjasnienia, Mozliwe ze pogubilem sie w tych komendach,. Mam prośbe czy mogłbyś mi napisac przykladowe komendy do robienia backupu bazy online z logami i potem jej odtworzenia.
pozdrawiam, Janusz
Artur - 04-07-2007 00:01
On 3 Lip, 14:52, "Janusz M" <januszms.remove...@interia.pl> wrote: > > 2. Zrobilem sobie backup online bazy danych z opcja INCLUDE LOGS, potem > > odtworzylem ja a potem zawarte w niej logi do innego katalogu. Niestety > > przy probie odtworzenia logow > > prosi o dalsze logi, nie wystarczaja te ktore byly dolaczone do backupu. > > Czy > > ta opcja > > wogole działa ?. > > Backup online bez logow i odtwarzenie pozniej z zarchiwizowanych logow > > dziala ok. > > Ta opcja działa. > > Do odtworzenia backupu online potrzebujesz 1. obraz archiwum i 2. > pliki dziennika tranksakcji (logi). > > ...... > > Wielkie dzieki za wyczerpujace wyjasnienia, > Mozliwe ze pogubilem sie w tych komendach,. > Mam prośbe czy mogłbyś mi napisac przykladowe komendy > do robienia backupu bazy online z logami i potem jej odtworzenia. > > pozdrawiam, Janusz
[backup online] db2 backup db baza1 online include logs
[odtworzenie] db2 restore db baza1 LOGTARGET c:\DB2LOGS\roboczy
db2 rollforward db baza1 to end of logs overflow log path ('c:\DB2LOGS \roboczy') db2 rollforward db baza1 complete overflow log path ('c:\DB2LOGS \roboczy')
Dwa ostatnie polecenia można zrobić w jednym kroku, wystarczy dodać "and complete" po klauzuli "to end of logs". Zwykle daję "complete" w następnym kroku, bo mam jeszcze szansę na uzupełnienie katalogu dodatkowymi logami (np. które zostały zarchiwizowane ręcznie) i powtórzenie dogrania.
Jeśli poda się klauzulę "to end of logs" DB2 automatycznie także sięga do podstawowego miejsca gdzie były archiwizowane pliki i stamtąd próbuje także dograć transakcje.
-- Artur Wroński
Artur - 04-07-2007 00:01
> 1. jak zauważyłem DB2 nie trakuje kluczy obcych w tabelach jako indeksow > i do wiekszosci zapytan ich nie uzywa. Musialem podefiniowac dodatkowe > indeksy w tabelach > takie same jak klucze obce. W dokumentacji jest ze jak dam w definicji > klucza obcego > ENABLE QUERY OPIMIZATION to bedzie on uzywany do optymalizacji zapytan, ale > to nie dziala (odswierzone wszystkie statystyki w tabeli) . Moze potrzebne > jest ustawienie jakiegos parametru w bazie danych ?. >
chyba wcięło mój poprzedni post.
Dla klucza obcego nie są automatycznie tworzone indeksy -- nie ma takiej potrzeby.
Najlepiej utworzyć najpierw gołe tabele, potem te indeksy, które się chce, a następnie warunki integralnościowe (constraints), np:
create table drzewo( rodzic int, wezel int not null, nazwa char(25)) ;
create index rodzic_idx on drzewo (rodzic); create unique index wezel_idx on drzewo (wezel);
alter table drzewo add constraint drzewo_pk primary key (wezel);
alter table drzewo add constraint drzewo_fk foreign key (rodzic) references drzewo on delete cascade;
W takim układzie klucze podstawowe skorzystają z utworzonego indeksu i zachowają jego nazwę. Jeśli chodzi o optymalizację, to chodzi o wykorzystanie technik, które pozwolą przyspieszyć zapytani. Np. można pominąć którąś z tabel, jeśli ktoś będzie robił np. select count(*) from tab1, tab2 where tan1.pk = tab2.fk, w przypadku warunków ograniczających można sprawdzić czy predykaty zapytania pasują o definicji CHECK CONSTRAINT.
-- Artur Wroński
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
Oracle, SQL, PL/SQL. Jak =?ISO-8859-2?Q?napisa=E6_zapytanie=2C?==?ISO-8859-2?Q?_kt=F3re_zwr=F3ci_nazw=EA_atrybutu=2C_kt=F3reg o?==?ISO-8859-2?Q?_warto=B6ci_spe=B3niaj=B1_zadany_warunek?=
=?ISO-8859-2?Q?Narz=EAdzie_do_budowania_zapyta=F1_SQL=2C?==?I SO-8859-2?Q?_PL/PgSQL=2C_PL/SQL=2C_T-SQL?=
[ms sql] =?ISO-8859-2?Q?wy=B6wietlenie_pierwszych_5_rekord?==?ISO-8859-2?Q?=F3w_z_zapytania_=3F_odpowiednik_ROWNUM_w_o?== ?ISO-8859-2?Q?raclu_dla_MS_SQL=27a?=
phpMyAdmin zadaje =?ISO-8859-2?Q?z=B3e_zapytania=2E=2E=2E_Dl?==?ISO-8859-2?Q?aczego=3F?=
[MSSQL2000] Problem z =?ISO-8859-2?Q?tabel=B1/indeksem/zapytanie?==?ISO-8859-2?Q?m_czy_b=B3=B1d_w_bazie_danych=2E=2E=2E?=
[mysql 5.x] jak =?ISO-8859-2?Q?zrealizowa=E6_zapytanie=3F_cz?==?ISO-8859-2?Q?yli_podzapytanie_i_wi=EAcej_ni=BF_jeden_rz=B1? ==?ISO-8859-2?Q?d_wynik=F3w?=
[oracle] zapytanie dynamiczne z =?ISO-8859-2?Q?=22dynamiczn=B1_?==?ISO-8859-2?Q?nazw=B1_tabeli=22?=
[mysql/php] jak =?ISO-8859-2?Q?zliczy=E6_ilo=B6=E6_unikalnyc?==?ISO-8859-2?Q?h_rekord=F3w_w_jednym_zapytaniu=3F?=
[MySQL] Zapytanie z =?ISO-8859-2?Q?dw=F3ch_tabel_na_raz_?==?ISO-8859-2?Q?i_grupowanie_po_wsp=F3lnym_polu=2E_Jak_=3F?=
mecze sie i mecze i nic - zapytanie czesciowe
zanotowane.pldoc.pisz.plpdf.pisz.pllunadance.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|