konto usunięte

Temat: Antywzorce programisty baz danych

Witam,

temat zawarty w tytule stał się tematem mojej pracy magsiterskiej.

Chciałbym, korzystając z możliwości WEB 2.0 ;) zapytać Was, jako programistów, co takim antywzorcem może być.

Podkreślam, że temat dotyczy programistów, czyli raczej szeroko rozumianego pisania zapytań i widoków, tworzenia funkcji, i optymalizacji tychże, nie zaś projektowania bazy danyc.

Byłbym bardzo wdzięczny za każdą konstruktywną odpowiedź ;)

Tutaj np. znalazłem ciekawy przykład dla tego tematu:
http://students.mimuw.edu.pl/oracle10g/server.101/b107...

konto usunięte

Temat: Antywzorce programisty baz danych

np.

Jak sprawdzić, że rekord jest z bieżącego roku (zawiera kolumnę typu data_wstawienia):

to_char(data_wstawienia,'yyyy') = to_char(sysdate,'yyyy')

W sumie mozna przy okazji mały konkurs ... jakbyście to rozwiązali przy założeniu, że jest indeks na tej kolumnie i warto byłoby z niego skorzystać (10 mln rekordów na 5 lat) ?

A jeśli już trzymamy się tematu, to jak to zrobić jeszcze gorzej ? :)
Adam Grech

Adam Grech when performance
does matter

Temat: Antywzorce programisty baz danych

mozna zaproponować:

jesli index funkcyjny po trunc(data_wstawienia,'YYYY'):
trunc(data_wstawienia, 'YYYY')= trunc(sysdate, 'YYYY')

calkiem czesto spotykany:

data_wstawienia >= to_date(1-01-2008) and
data_wstawienia < to_date(1-01-2009)

----
czeste niefajne rozwiazania ktore spotykam....

update TABELI > 50 mln. wierszy na raz (bez warunkow where) - a bardzo czesto czas niedostepnosci do BD jest trzeba minimalizowac

dodanie kolumny z default'em i constraintem not null do duzych tabel

konto usunięte

Temat: Antywzorce programisty baz danych

To jest napisane z poziomu klepacza PL/SQL

Niektóre z poniższych błędów i ja sam popełniałem

1. No comments

BEGIN
....
.....

EXCEPTION
WHEN OTHERS THEN
COMMIT ;

END;

-----------------------------------------
2. Brak NVL w algorytmach obliczeniowych

DECLARE
a INTEGER;
b INTEGER :=1;
BEGIN
DBMS_OUTPUT.PUT_LINE(a + b);
END:
inna sprawa, że wg mnie pola używane do obliczeń powinny być DEFAULT 0 NOT NULL. Nawet jeśli się to przestrzega, warto wstawiać NVL dla świętego spokoju..

Nieznajomość faktu, że niektóre funkcje agregujące np AVG zadziałają inaczej dla wartości NULL i NOT NULL
SELECT AVG(pole_liczbowe) FROM tabela
zadziała inaczej
SELECT AVG( NVL(pole_liczbowe,0)) FROM tabela
jeśli pole liczbowe bedzie przyjmować wartości NULL

3 Nadużywanie DBMS_OUTPUT w pętlach po dużych tabelach

4. Warunek LENGTH( zmienna_tekstowa) =0 zamiast zmienna tekstowa IS NULL

5. Deklarowanie zmiennych odpowiadających polom w tabeli bez korzystania z zakotwiczeń %TYPE. Szczególnie ciekawym przypadkiem jest inna maksymalna długość VARCHAR2 w polu tabeli i jako zmienna w kodzie

6. W obrębie bazy deklarowanie tabel z polami VARCHAR2 ( size CHAR)i VARCHAR2( size BYTE)

7. Nadużywanie dynamicznego SQL - chociaż czasami bywa niezbędny

8. Nadawanie id rekordom w inny sposób niż przy użyciu sekwencji

9. Dokonywanie konwersji ze stringów na liczby i na daty bez podania masek - taki kod jest nieprzenośny zupełnie

10. Stosowanie zmiennych typu CHAR

11. Niepodawanie obiektom baz danych w kodzie PL/SQL nazw schematów. I to wszystkim bez wyjątku !!! Czasami w dużej bazie może pojawić się kilka tabel klienci w rożnych schematach i mamy pewne źródło problemów. Przy migracji i scalaniu baz podawanie ownerów mocno ułatwia życie... Dlatego też sądzę, że dla kluczowych tabel należy tworzyć publiczne synonimy coby mniej rozgarnięci userzy nie popełnili ich w swoich schematach...

12. Stosowanie hintów w zapytaniach.
SELECT /*+ INDEX( t idx_klienci_nazwa) */ from schemat.tbl_klienci t where t.nazwa = vc_Nazwa
Po mojemu hintów już od bazy 10g nie powinno się używać - wbudowany optymalizator radzi sobie z optymalizacją dobrze. Zaszycie hinta niesie za sobą niebezpieczeństwa związane z przebudową, usunięciem, rozszerzeniem indeksów, przeprowadzką rzadkich indeksów na bitmapowe przy migracji na enterprise, zmianą liczebności zbiorów danych i sposobem ich przechowywania( np.partycjonowanie tabel) - co może spowodować spory spadek wydajności... Lepiej jest więcej czasu poświęcić na rozpracowanie opornego zapytania niż umieszczać wskazówki w kodzie...

13. Pogrzebmy w bebechach
select UPPER(username), UPPER (osuser), UPPER (program), UPPER( machine)
into vc_UserName, vc_OSUser, vc_Program, vc_Machine
from v$session
where sid = USERENV('sid');
Staranie się, aby unikać odwołań do tabeli słownikowych, a jeśli się tego nie uda to takowe wywołania wsadzić do osobnego pakietu i korzystać tylko i wyłącznie z funkcji pakietowych... Tak samo w przypadku pakietów systemowych - wywołania należy opakować

14. Uprawnienia
grant SELECT, INSERT, DELETE, UPDATE on fk.tbl_faktury to PANI_BASIA;
grant SELECT on fk.tbl_faktury to PANI_JOLA.
Wszelakie uprawnienia do obiektów bazodanowych rozdzielać wyłącznie za pomocą ról, użytkownikom nie wolno nadawać ról bezpośrednio, to prowadzi do trudnego do opanowania chaosu w kodzie. Bywają czasami pojętni użytkownicy piszący własne procedury, dla nich można zrobić wyjątek, dla pozostałych lamerów nie

15 czytelność kodu
select * from schemat.klienci... Stosowanie standaryzowanych przedrostków (tbl_, vw_, seq_, mv_, pdb_, pckg_ ) do obiektów baz danych - aby w wypadku choroby genialnego kodera lub błędów runtime dało się cokolwiek zrozumieć, co genialny twórca miał na myśliKazik Szkaradnik edytował(a) ten post dnia 13.07.09 o godzinie 21:26

Temat: Antywzorce programisty baz danych

Tomasz P.:
Witam,

temat zawarty w tytule stał się tematem mojej pracy magsiterskiej.

Chciałbym, korzystając z możliwości WEB 2.0 ;) zapytać Was, jako programistów, co takim antywzorcem może być.

Noooo programistą to niestety nie jestem, ale coś nieco dorzucę.

Dwie sprawy raczej "podejście" niż przykłady:

- Kompletne ignorowanie istnienie czegoś takiego jak uprawnienia na poziomie bazy danych przez znaczną część dostawców softu.
Przykrym standardem jest, że konto administratora aplikacji ma często na poziomie bazy danych nadaną rolę DBA, gdzie w zupełności wystarcza np: przekazanie uprawnień do obiektów z "grant option".
A już tekst dyżurny "ma dba bo musi ubijać sesje użytkowników/odblokowywać konta" to już przestał mnie śmieszyć.

- podejście do aplikacji pisanych w j2ee które mają korzystać z mappera obiektowo-relacyjnego czyli "database dosen't matter", niech ktoś czasami rzuci okiem na to co mapper sobie za modelował na poziomie bazy, bo potem będzie wstyd :-PP

Czasami mam wrażenie, że część developerów to jakoś organicznie dba nie lubi ;-) i z definicji nie będzie się pytać bo dostanie RTFM albo SOA #1 "U mnie działa" :-D Wiem, że są takie przypadki, ale większość znanych mi dba woli raczej spędzić 5 dni na tłumaczeniu i tunningu środowiska test/uat niż 1 dzień na awaryjnym dłubaniu przy produkcji zwykle o porach mało cywilizowanych ...

Temat: Antywzorce programisty baz danych

Adam Rzadkowolski:
dodanie kolumny z default'em i constraintem not null do
duzych tabel

wiem że to oczywiste ale:

nie jednym poleceniem bo zacznie tak jakby uzupełniać null'e w tej kolumnie ;-P (oczywiście jak tabelka jest mała/pusta to nie ma kwestii)
Maciej Marczuk

Maciej Marczuk Software Engineer

Temat: Antywzorce programisty baz danych

Ja sie kiedys spotkalem z dosc kreatywnym podejsciem do liczenia rekordow w tabeli ale nie wiem czy ktos uwierzy w takie ekstrema.

Wygladalo to w aplikacji mniej wiecej tak:

$q = "SELECT * FROM tableName"
...
fetchujemy wszystko do tablicy $res
...
$count = count($res)

...
Mariusz Masewicz

Mariusz Masewicz Prawie wszysko o
bazach danych Oracle
:-)

Temat: Antywzorce programisty baz danych

Maciek M.:

To ja widzialem lepciejszy kfjatek....
Ja sie kiedys spotkalem z dosc kreatywnym podejsciem do liczenia rekordow w tabeli ale nie wiem czy ktos uwierzy w takie ekstrema.
Wygladalo to w aplikacji mniej wiecej tak:
$q = "SELECT * FROM tableName"
...
fetchujemy wszystko do tablicy $res
...

Do tego miejsca podobnie - a teraz:
w petli
pobieramy wiersz tablicy jako stringa
szukamy w nim okreslonej wartosci
jezeli znalezlismy to zwracamy stringa bedacego tym wierszem, zeby w kolejnym kroku jakim stokenizerem rozbic to na pola
koniec petli

I jeszcze jedne kfiatek - firma web development i insze uslugi w temacie markjietingu internetowego. W portfolio sklepy, serwisy "aukcyjne" forumy, blogi, ... X lat na rynku (X > 5). No i do rzeczy - siedzimy se z wlascicielem firmy (zalozycielem, glownym projektantem, architektem i programista w jednym) przy piwku, rozmawiamy o duperelach i nagle ten wyskakuje z rewelacja: "a ty wiesz jaki ten SQL fajny - jak chce sobie pobrac dane o czymstam, to moge jednoczesnie zadac zapytanie do dwoch tabel..."

Pozdro

MasełMariusz Masewicz edytował(a) ten post dnia 19.02.09 o godzinie 16:50
Michał Bogdan

Michał Bogdan Oracle DBA, Acxiom
Polska

Temat: Antywzorce programisty baz danych

w pewnej znanej Polskie programistycznej firmie .. dla bardzo dużego klienta :

CREATE OR REPLACE FUNCTION XYZ
IS
/*
tutaj kawałek kodu, z którym sobie junior developer kompletnie nie poradził ... i gdy miał zdać swój fragment ... to postanowił 'zahaszować' całe body ... i zwracać OK... a że to system klasy BPM - to cały flow w najlepsze jechał pewnie dalej - więc myślał, że może się uda :)

*/
RETURN 0;

END;

najlepsze jest to, że to przeszło testy .. i taki kod trafił na produkcje .. a mojemu znajomemu (senior developer w tej organizacji) przyszło go poprawiać w jakimś krytycznym trybie

------

i jeszcze jeden przykład : tabelka o dosc konkretnych rozmiarach
jeden z użytkowników uruchamia :

delete from table_xyz;

na pytanie, czemu tak robi ?

odpowiedział, że się boi truncate robić .. a uzywajac delete ma przynajmniej pare godzin do namysłu - czy aby na pewno z dobrej tabelki dane usuwa :)

konto usunięte

Temat: Antywzorce programisty baz danych

Do antywzorców dodałbym jeszcze stosowanie SYSDATE w pakietach. O ile w prostych zapytaniach z palca łatwo poprawia się parametry czasowe, to pakiety to czarna skrzynka... Uważam, że zwłaszcza dla obliczeń finansowych należy zamiast SYSDATE stosować parametry. Wyobraźmy sobie obliczanie odsetek zapuszczone na noc ( część się wykona przed północą, część po ) z wykorzystaniem SYSDATE. Jest to przypadek ekstremalny, ale widziałem wariant pośredni
Dlatego warto sprawdzić twórczość na bazie
SELECT * FROM all_source where UPPER(text) LIKE '%SYSDATE%' AND owner IN ( lista podejrzanych)

Temat: Antywzorce programisty baz danych

Andrzej P.:

Noooo programistą to niestety nie jestem, ale coś nieco dorzucę.

Ja tez ja tez ;)

Dwie sprawy raczej "podejście" niż przykłady:

- Kompletne ignorowanie istnienie czegoś takiego jak uprawnienia na poziomie bazy danych przez znaczną część dostawców softu.

Czasami to rozszerza sie do ignorowania wogole wszystkiego co
ma zwiazek z baza danych - i pisanie złączeń tabel na poziomie aplikacji a nie bazy danych ;) - widzialem coś takiego w pewnym banku gdzie im wolno działał system ;) ciekawe dlaczego ;)


- podejście do aplikacji pisanych w j2ee które mają korzystać z mappera obiektowo-relacyjnego czyli "database dosen't matter", niech ktoś czasami rzuci okiem na to co mapper sobie za modelował na poziomie bazy, bo potem będzie wstyd :-PP


No szczytem tu jest zakładanie nowej TABELI dla każdej nowej operacji exportu danych ;) - a w każdej nowej tabeli jeden wiersz ze statusem eksportu ;)

Czasami mam wrażenie, że część developerów to jakoś organicznie dba nie lubi ;-) i z definicji nie będzie się pytać bo dostanie RTFM albo SOA #1 "U mnie działa" :-D Wiem, że są


Ja ma wrażenie takie ze z reguly środowisko dev/test jest nieadekwatne do środowiska prod ... przykład raportowy -
środowisko dev w tabeli głownej ma 1000 wierszy - środowisko prod w tabeli głównej ma 10 000 000 000 wierszy ;) no ale u developera działa ;) wiec SOA #1 można dostać w dwie strony ;)

pozdrawiam,
Marcin Przepiorowski

konto usunięte

Temat: Antywzorce programisty baz danych

Michał Bogdan:
odpowiedział, że się boi truncate robić .. a uzywajac delete ma przynajmniej pare godzin do namysłu - czy aby na pewno z dobrej tabelki dane usuwa :)

Dziwne i nielogiczne, bo przy takich operacjach zazwyczaj robi się backup :) Byle exp ...
Michał Bogdan

Michał Bogdan Oracle DBA, Acxiom
Polska

Temat: Antywzorce programisty baz danych

Krzysztof P.:
Michał Bogdan:
odpowiedział, że się boi truncate robić .. a uzywajac delete ma przynajmniej pare godzin do namysłu - czy aby na pewno z dobrej tabelki dane usuwa :)

Dziwne i nielogiczne, bo przy takich operacjach zazwyczaj robi się backup :) Byle exp ...

no co zrobić ... co developer/user to inne uciechy :)
Tomasz O.

Tomasz O. Linux Engineer, team
lead

Temat: Antywzorce programisty baz danych

Co prawda sytuacja odnosiła się do postgresa, ale spotkałem się już z taką perełką w php, że programista ściągał selectem milion rekordów, po to by je policzyć phpcem w pętli ;)
Marcin Badtke

Marcin Badtke Administrator Baz
Danych, Citibank
Europe plc

Temat: Antywzorce programisty baz danych

jak dla mnie to temat rzeka. ulubione od których zaczynam analizę gdy dostaje telefon "co się stało z bazą danych bo aplikacja nie działa":
1. full scany (brak indeksów, zapytania nie korzystające z indeksów, indeksy na nullach, itp.)
2. brak użycia zmiennych wiązanych w zapytaniach
3. wielokrotne kompilowanie zapytania w aplikacjach pracujących na serwerze aplikacji (wywołanie sql_conn.prepareCall(...) dla każdego wejścia do metody)

kolejne:
4. ignorowanie tabel IOT. szczególnie dla tabel których wszystkie kolumny są w primary key
5. nadmiarowe indeksy (index na (col1, col2) i drugi na col1)
6. ignorowanie klauzuli compress dla indeksów
7. nadmierne stosowanie nulla - szczególnie upierdliwe dla kolumn indeksowanych
8. ignorowanie archiwizacji danych - no, ale może to powinno być w wymaganiach biznesowych

Temat: Antywzorce programisty baz danych

Marcin Badtke:
jak dla mnie to temat rzeka. ulubione od których zaczynam analizę gdy dostaje telefon "co się stało z bazą danych bo aplikacja nie działa":
1. full scany (brak indeksów, zapytania nie korzystające z indeksów, indeksy na nullach, itp.)

Witam,

FS nie jest sam w sobie zly, ale to zalezy od aplikacji.
Jest zly gdy zwracach 1 rekord z mln.
2. brak użycia zmiennych wiązanych w zapytaniach

To tez zalezy od aplikacji, generalnie w OLTP nie sa zle,
ale w raportach juz bym na nie uwazal

pozdrawiam,
Marcin Przepiorowski
Marcin Badtke

Marcin Badtke Administrator Baz
Danych, Citibank
Europe plc

Temat: Antywzorce programisty baz danych

Prawda, prawda. Zaklamkowałem się na OLTP.

konto usunięte

Temat: Antywzorce programisty baz danych

.Dariusz W. edytował(a) ten post dnia 13.05.09 o godzinie 10:13

Temat: Antywzorce programisty baz danych

Dariusz W.:
.Dariusz W. edytował(a) ten post dnia 13.05.09 o godzinie 10:13

Coz za wymowna wypowiedz :-)

konto usunięte

Temat: Antywzorce programisty baz danych

Wypowiedz odnosiła się do NULL-i

Następna dyskusja:

OFERTA PRACY: Administrator...




Wyślij zaproszenie do