Kiedy wybieram AWS DynamoDB, zaczynam liczyć bajty

Tak jest. Maksymalny rozmiar wpisu w tabeli DynamoDB wynosi 400KB, jak wskazuje oficjalna dokumentacja. Natomiast, oficjalna dokumentacja nie wspomina o metodzie wyliczania rozmiaru wpisu.

Otóż, na końcowy rozmiar wpisu w tabeli DynamoDB składa się: rozmiar nazwy atrybutu zakodowane w utf-8 (w większości przypadków będzie to 1 bajt per symbol) oraz rozmiar wartości atrybutu. Rozmiar wartości atrybutu zależy od typu danych wykorzystanych, np. jeśli jest to zwykły string to rozmiarem wartości będzie wartość zakodowana w UTF-8 (od 1 do 4 bajtów na symbol). Jeśli natomiast będzie to Map (objekt w plain JSON), to trzeba doliczyć jeszcze 3 bajty (const) oraz po 1 bajcie na każdą parę klucz-wartość, no i rozmar samych par klucz-wartość też trzeba policzyć – w wyniku tego, nawet pusta mapa będzie miała co najmniej 3 bajty.

400KB to jest wystarczajćo dla mniejszych dokumentów, natomiast kiedy dokumenty przechowywane w DynamoDB są generowane na podstawie danych wprowadzonych przez użytkowników, to trzeba liczyć się z tym, że prędziej czy później dostaniemy błąd

An error occurred (ValidationException) when calling the PutItem operation: Item size has exceeded the maximum allowed size
Czytaj dalej

Kryptografia symetryczna i asymetryczna

Coraz częściej słychać w świecie o wymagalności szyfrowania danych, czy to danych osobistych użytkowników systemów informatycznych, czy to bezpiecznego przesyłania informacji pomiędzy systemami informatycznymi. Dlatego w tej skromnej publikacji chciałbym omówić jakie są główne różnice kryptografii symetrycznej i asymetrycznej oraz jak można używać obu do implementacji najbezpieczniejszej komunikacji.

Zacznijmy od podstaw, a dokładnie – jak działają algorytmu kryptografii symetrycznej i asymetrycznej.

Czytaj dalej

Optymalizacja implementacji `Insert or Update` zapytań na bazie danych

Proszę Państwa, czasem jest potrzeba zrobić coś a’la Insert or Update. Zadanie jest dość trywialne, ale nie zawsze optymalne zarówno pod względem czasu implementacji jak i czasu wykonania – pierwsze co wpada do głowy, to implementacja czterech kroków:

  1. Wyciągnij wpisy z tabeli które spełniają wymagania
  2. Sprawdź czy wynik poprzedniego zapytania jest pusty
  3. Jeśli odpowiedź jest pozytywna – wykonaj UPDATE
  4. W przeciwnym razie wykonaj INSERT

W takich sytuacjach bardzo się przydaje zgłębienie wiedzy w narzędziach i zapytaniach wychodzących poza zakres ANSI SQL np. Transact-SQL (MS Sql Server) lub PL/pgSQL (Postgres). Oba te wyżej wspomniane języki mają cudowne narzędzie umożliwiające wykonanie całej roboty InsertOrUpdate za jednym zapytaniem – tzw UPSERT.

Nazwa pochodzi od połączenia dwóch słów – UPDATE oraz INSERT. Założenie takiej kwerendy jest proste – spróbuj wstawić nowy rekord do tabeli, i w przypadku pojawienia się błędu o duplikacje, zrób update.

Czytaj dalej

Uruchomienie JIRA Software w Dockerze

Jako że jestem wielbicielem kontenerków, pamiętam jeszcze dzieciakiem miałem styczność z kontenerami na moim starym Siemens A55 albo Siemens A60 – nie pamiętam już ?; postanowiłem sobie przenieść swą instancję JIRA Software z dedykowanego EC2 hosta do dockera.

Zacznijmy od tego że potrzebujemy Oracle JRE do uruchomienia tego wspaniałego oprogramowania, a jak wiadomo Oracle lubi utrudniać życie innym przez wprowadzenie zakazu dystrubucji JRE – chodzi o to że nie można zrobić skrypt który automatycznie pobierze i zainstaluje JRE w kontenerze, ale można bez problemu wejść na stronę Oracle i ściągnąć JDK nie naruszając licencji. Chodzą plotki, że JIRA już wpiera OpenJDK – ale oficjalnie od wersji 7.13, natomiast ja posiadam licencję na wersję ciut starszą – 7.12, niestety ?

Czytaj dalej

Indeksowanie kolumny typu NVARCHAR(MAX)

Bardzo rzadko piszę tutaj, jest to spowodowane tym że jestem leniwym, ale dziś zwalczyłem leń i przekazuję do użytku publicznego prostą receptę na indeksowanie kolumny typu NVARCHAR(MAX).

Ostatnio zderzyłem się z wydajnością jednej z procedur składowanej (ang. stored procedure), a mianowicie – łączenie tabeli z inną tabelą po kolumnie tupy NVARCHAR(MAX) daje bardzo słabą wydajność prz >1k rekordów w tabeli. Teraz każdy może powiedzieć – no panie, wiadomo że trzeba założyć indeksy ? Czytaj dalej

Wydajność NHibernate przy dużych ilościach danych

Ostatnio w pracy napotkaliśmy się na problem związany z wydajnością NH przy opracowaniu dużej ilości danych (200k+ rekordów). Problem wystąpił przy próbie usunięcia tych rekordów.

Background

Mamy własny Windows Service, który co jakiś czas odpala nasze „joby”, taki sobie customowy task scheduler. Jeden z tasków przepracowuje tabele w której się znajduje prawie 1mln rekordów. Ten task robi dokładnie jedną rzecz – usuwa stare, niepotrzebne nam rekordy. Czytaj dalej