Marcin's profile"Powoli wyczuwaj swe pow...PhotosBlogListsMore Tools Help

Blog


    June 13

    Wymiarowanie serwerów baz danych

    Wczoraj (12 czerwca), na kolejnym spotkaniu Grup warszawskich, prowadziłem krótką sesję o planowaniu pojemności serwerów baz danych. Sama sesja była dość ogólna - ze względu na skrócony czas oraz na "śliskość" tematu - pomimo tego wychodząc z sali słyszałem raczej pozytywne głosy :)
    Dziękuje wszystkim którzy zechcieli mnie wysłuchać i obiecuje że w najbliższej przyszłości umieszczenie tutaj linki do materiałów jakie okazały się pomocne w trakcie przygotowywania sesji (prezentacje, artykuły).

    Materiały:
    B.Deptuła, M.Przepiórowski, M.Kwaśniński, P.Chomicz, Capacity Planning dla baz danych Oracle
    J.Allspaw, Capacity planning for LAMP
    R.Schiesser, Why Capacity Planning Is Seldom Done Well
    J.Chang, Sizing for SQL Server 2000 and 2005
    TeamQuest, How to Do Capacity Planning
    June 01

    like '[A-Z]QLServer' vs. like '_QLServer'

    ostatnio na forum wss.pl pojawił się wątek o przesukiwaniu ciągów znakowych, punktem wyjścia dla niniejszego researchu był post Pawła Potasińskiego (aka brejk):

    Akodo_Shado:
    select name from slowa
    where name LIKE 'kote[a-z]%'.
    Efekt był piorunujący! 140 wyników w mig.
     
    brejk:
    I nic dziwnego. Przecież w tych 3,5 mln słów ile mogło się zaczynać od "kote" :-) Naturalne, że przy tak dobrej selektywności serwer może użyć indeksu na polu name (jakiegokolwiek indeksu, warto dodać).
     
    Akodo_Shado:
    Konsekwencja tego problemu jest też taka, że
    o ile 'kote[a-z]%' robi się błyskawicznie o tyle
    '[a-z]%otek' już nie koniecznie.
     
    brejk:
    Co w tym dziwnego? W drugim przypadku serwer musi przecież przeszukać praktycznie całą tabelę (od a do z).

    Paweł miał rację, to jasne ... ale ale ... od czego jest kombinacja CTRL + L :)
     
    research rozpoczął się od zrobienia tabeli:
    create table test2 ( id int, ciag char(36),ciag_rev char(36));
    go
    declare @i int
    set @i = 0
    while (@i < 1000000)
    begin
     insert into test2 (id, ciag) values (@i,convert(char(36), newid()))
     set @i = @i + 1
    end
    Pierwszy pomysł jaki mi wpadł do głowy był taki żeby zrobić drugą kolumnę z:
    update test2 set ciag_rev = reverse(ciag)
    go
    mamy tabele bez indeksów, robię z niej dwa zapytania jak poniżej:
    (mam w kolumnie ciag wartosc: '00006BB4-215F-424E-8B99-9A69A5C94A97')

    select ciag,id from test2 where
    ciag like '[0-9]0006BB4-215F-424E-8B99-9A69A5C94A97'

    select ciag_rev,id from test2 where
    ciag_rev like '79A49C5A96A9-99B8-E424-F512-4BB6000[0-9]'

    wybieram CTRL+L i widze:

    50_50

    następnie robię 1x klastrowany + 2x nieklastrowany:

    create clustered index idx_id on test2 (id)
    create nonclustered index idx_ciag on test2 (ciag)
    create nonclustered index idx_ciag_rev on test2 (ciag_rev)

    wykonuje to same 2 zapytania:

    50_50_clx

    zmienia sie plan wykonania (nie mamy już table scan, mamy index seek ... ale tak czy siak nie ma znaczenia czy nieznany znak znajduje sie jako pierwszy czy jako ostatni! Sprawdzam dalej podmieniając aż do: '[0-9][0-9][0-9][0-9][0-9]BB4-215F-424E-8B99-9A69A5C94A97' i dalej nic .... nie ma znaczenia czy nieznane znaki są na końcu czy na początku...

    dopiero kiedy robię:

    select ciag,id from test2 where
    ciag like '%0006BB4-215F-424E-8B99-9A69A5C94A97'

    select ciag_rev,id from test2 where
    ciag_rev like '79A49C5A96A9-99B8-E424-F512-4BB6000%'

    sprawa się wyjaśnia ...

    100_0

    Wniosek:
    wskazywać SQL Serverowi czego może sie spodziewać a wówczas nawet jeśli nie będziemy znali pierwszych znaków to:

    - seek bedzie jeśli użyjemy:
    [0-9]ciag_znakow
    [a-zA-Z0-9]ciag_znakow

    - scan będzie jeśli:
    _ciag_znakow
    %ciag_znakow

    Jesli mimo wszystko ktoś musi specyfikować ciągi znaków przy pomocy _ lub % to wówczas można spróbować dołożyć kolumnę z odwróconą kolejnością liter (w szczególności jeśli tabela ze słownikiem nie jest rozmiarów setek mln wierszy) - wówczas pozbędziemy się skana i pojedziemy po seeku :)))

    mRemote

    Mamy dziś Dzień Dziecka - więc prezent dla wszystkich dużych dzieciaków - przydatna zabawka do codziennej pracy... Jakiś czas temu Karol Stilger pokazał mi mały program o nazwie mRemote - zabawka na tyle mi się spodobała że dostaliście ją dziś na prezent :)))
     
    Czym jest mRemote: jak nazwa wskazuje jest to menadżer pulpitów/połączeń zdalnych, umie obsługiwać protokoły: RDP, VNC, ICA, SSH, Telnet, HTTP/S, Rlogin, RAW.
     
    Krótki opis: aplikacja przechowuje informacje o zdalnych hostach w pliku sformatowanym XML, umożliwia podłączenie do nich i zdalną pracę; pulpity zdalne są w oparciu o zakładki więc wszystko jest bardzo wygodne w obsłudze i zajmuje mało miejsca na pasku start; istnieje wersja "portable" - ale ja jej nie używałem jeszcze.
     
     
    Licencja: póki co GNU/GPL v2 (tekst), ale autor zaczyna przebąkiwać że projekt stanie się komercyjny
     
    Jak to wygląda:
     
    same_screen
     
    Po krótkiej prezentacji aplikacji możecie się z nia bliżej poznać, poniżej przedstawiam krótkie FAQ (odpowiedzi dla wersji 1.43 beta):
     
    1) jak zainstalować?
    odp: z w/w strony ściągamy paczkę, klikamy 2 razy, klikamy next, install, finish i sprawa jest załatwiona :))
     
    2) jak uruchomić?
    odp: na standardowych ustawieniach aplikacja powinna zrobić sobie folder w Menu Start - można jej tam poszukać - jak nie będzie to można też sobie przypomnieć gdzie się ja instalowało; ponizej przykładowe pierwsze uruchomienie (po lewej widać początek naszego drzewa do zarządzania połączeniami):
     
    start_up_screnn
     
     
    3) co zrobić żeby się połączyć do komputera X protokołem Y
    odp: Prawa mysz na węźle "Connections", wybrać "Add Connection" a potem to już jak Ci serce dyktuje :))
     
    first_time
     
    4) mam 100 połączeń - czy muszę je dodawać ręcznie?
    odp: ja nie znalazłem bezpośredniego rozwiązania problemu, ale są sposoby obejścia:
    sposób A) można wygenerować plik XML z połączeniami i spróbować go załadować do programu
    sposób B) można używać dziedziczenia właściwości ... tzn. zaznaczyć węzeł "Connections", następnie kliknąć to:
     
    def_ops
     
    wypełnić wartości tego co nas interesuje żeby było dziedziczone, następnie kliknąć to:
     
    inh_ops
     
    wybrać pola jakie maja być dziedziczone. W ostatnim kroku można pójść na łatwiznę i powiedzieć "dziedzicz wszystko", a najwyżej później na tworzonym połączeniu usunąć dziedziczenie danej właściwości;
    sposób C) można duużo sobie poklikać (tutaj mały hint: polecam "Duplicate" CTRL + D)
     
    5) czy ten program umie coś więcej poza łączeniem się na zdalne maszyny ?
    odp: tak umie, przykładowe dodatki:

    dodatek A) "External application" - w kontekście wybranego połączenia potrafi uruchomić jedno ze zdefiniowanych wcześniej wywołań aplikacji zewnętrznej, np.: polecenia ping. Jak to zrobić ?
    Z  menu Tools  (główne menu programu) -> external applications -> prawa mysz -> add -> w małym oknie, na dole, wpisujemy nazwe wyswietlana wskazujemy plik uruchomieniowy aplikacji oraz argumenty wywołania np.: najprostsze wywołanie ping:
     
    external
     
    Zmienne jakich możemy użyć przy definiowaniu wywołania aplikacji zewnętrznej:

    %Name%
    %Hostname%
    %Port%
    %Username%
    %Password%
    %Domain%
    %Description%

    dodatek B) prosty port skaner - tak prosty że chyba nie ma co pokazywać, ale myślę że tutaj do tego programu jest wystarczający

    dodatek C) prosty moduł do zarządzania screenami z maszyn na jakie jesteśmy połączeni (strzałka czerwona)
     
    screen_shot 
     
    od razu widać też gdzie m.in. można wywołać external apps...
     
    dodatek D) aplikacja umie też się posługiwać transferem plików po ssh ^^ 
    dodatek E) .... inne jakich nie odkryłem.
     
    6) co z bezpieczeństwem haseł?
    odp: Kolega programista, który to pisał zdaje się (po tym jak na szybko przejrzałem kody) korzysta z klasy RijndaelManaged z przestrzeni nazw System.Security.Cryptography.

    7) Gdzie jest plik z konfiguracją połączeń ?
    odp: u mnie był na: C:\Documents and Settings\<user name>\Local Settings\Application Data\Felix_Deimel\mRemote\confCons.xml
     
     pozdrawiam wszystkich i jeszcze raz najlepszego !