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

Blog


    May 14

    SQL Server rozumie język polski !!!

    No a skąd o tym wiem?
     
    ano wchodzę sobie na WSS - a tam sekcji "Nowości na stronach Technet" widzę artykuł: "Dostosowanie alokacji pamięci dla zapytań w SQL Server 2008" - klikam sobie żeby zobaczyć co też ciekawego tam pokazano ...
    Czytam, czytam ... w końcu trafiam na kawałek kodu T-SQL i jakieś było moje zdziwienie!!! SQL Server rozumie język Polski!!!! screen poniżej ...

     

    Oczywiście jest to tylko jeden z wielu przypadków sprawności technicznego review jakie jest stosowane w polskim centrum rozwiązań ! Jeśli Microsoft zdecyduje się na sprawdzenie zawartości artykułów pod tym względem - z chęcią pomogę!

    A no i jeśli ktoś chce sam poczytać o tej nowej wersji SQL Server znajdzie to tutaj:

    Dostosowanie alokacji pamięci dla zapytań w SQL Server 2008

    October 07

    Czy SQL Server wie ile może wykorzystać procesorów ?

    Na jednym z ostatnich spotkań PLSSUG Ziemek Borowski miał świetną sesję o licencjonowaniu. W pewnym momencie sesji stwierdził że licencencje SQL Serverowe można ustawiać za pomocą wpisów w rejestrze ... zapalony tym stwierdzeniem oraz wczorajszym pogonieniem mnie przez Pawła Potasińskiego poszukałem i znalazłem :))
     
    Klucz w rejestrze, który nas interesuje:
     
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\90\MSSQLLicenseInfo\MSSQL9.00
     
    A możemy tam wpisać:
    Mode REG_DWORD 2 --licencjonowanie na procesor
    lub
    Mode REG_DWORD 0 --licencjonowanie na klienta
    oraz
    ConcurrentLimit REG_DWORD liczba licencji --Liczba procesorów lub połączeń klienckich
     
    Oczywiście powyższe dane są w pełni dostępne z poziomu T-SQL. Niestety, zanim poniższy select zwróci wartości z rejestru należy wykonwać restart SQL Servera ;//
     
    SELECT  ServerProperty('LicenseType') as LicenseType, ServerProperty('NumLicenses') as ProcessorCount
     
    Jeśli w rejestrze nia ma powższych wpisów wówczas SQL Server zwraca taki wynik selecta:
     
    LicenseType....ProcessorCount
    ----------------------------------------
    DISABLED.......NULL

    Na koniec dodam tylko że pełny opis można znaleźć na blogu: Microsoft SQL Server Support i że przedstawione powyżej rozwiązanie jest supportowane przez MSFT :)))
    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 :)))