SQL 2016: Columnstore index idzie o krok do przodu

2016-05-22

Każda z wcześniejszych wersji SQL miała jedną znaczną bolączkę jeśli chodzi o columnstore index. Otóż utworzenie takiego indeksu wiązało się z tym, że tabela stawała się tylko do odczytu. W wersji 2014 problem został trochę osłabiony, bo clustered columnstore index mógł już być aktualizowany. Problem rozwiązano tam w ten sposób, że w momencie utworzenia indeksu wszystkie tradycyjnie zapisane rekordy były przerabiane na columnstore index, ale dodatkowo „za tym indeksem” powstawał dodatkowy obszar, w którym było można dopisywać informacje o modyfikacjach danych. Jeżeli więc dodano nowy rekord, to wisiał on sobie w tej dodatkowej przestrzeni, za indeksem columnstore. Jeśli rekord usunięto to podobnie dokładano taką informację w postaci tradycyjnego rekordu w tym dodatkowym obszarze. A jeśli rekord zmodyfikowano, to informację dokładało się dwa razy: raz jako usunięcie a raz jako dodanie. Ten obszar nosił nazwę delta store i dotyczył tylko indeksu clustrowanego.

W wersji 2016 podobną funkcjonalność dodano do indeksu nieclustrowanego. Ładne porównanie możliwości columnstore indeksu zawiera tabelka ze strony:

https://msdn.microsoft.com/en-us/library/dn934994.aspx

Jedną z głownych zalet posaidania takiego indeksu jest obecnie to, że jeżeli z danych ma korzystać zarówno aplikacja transakcyjna OLTP jak i analityczna OLAP, to wcale nie trzeba tworzyć dwóch instancji SQL połączonych przez procesy ETL. Do tej samej tabeli mogą sie odwoływać transakcje OLTP (bo tabela ma nadal kształt zwykłych rekordów), jak i analityczne (bo query optimizer sam dobierze najbardziej efektywny indeks i będzie to prawdopodobnie columnstore index).

Aktualizowalny nieklustrowany columnstore index podobnie jak to było z indeksem clustrowanym posiada oprócz danych zapisanych w kolumnach również delta store do zapamiętywania bieżących modyfikacji danych. Jeśli taka modyfikacja się przytrafi, to w ramach transakcji trzeba będzie zmodyfikować dane z normalnego (rowstore) indeksu oraz dane w delta store indeksu column store. Ale to nie wszystko!

Dane często charakteryzują się specyfinczym „tokiem życia”. Świeżo po wprowadzeniu do tabeli są gorące – „hot”, tzn. mogą podlegać intensywnym zmianom. Ale przychodzi taki moment, kiedy rekord „stygnie” i staje się „cold” i nie jest już często modyfikowany. Może to być rekord księgowy po zamknięciu miesiąca albo zamówienie, które zostało zrealizowane. Od wersji 2016 nonclustered column store indeks może być filtrowany! Wystarczy więc wymyślić filtr, który oddzieli dane hot od tych cold i nawet dellta store nie będzie musiał być zmieniany.

Zastosowanie tych nowych możliwości w SQL 2016 jest nazywane jako: Real-Time Operational Analytics

Bardzo ładnie opowiada o tym główny projektant dla column store indeksów:  Sunil Agarwal:

By Rafał Kraik in SQL 2016

SQL 2016: Słownik pojęć chmurowych

2016-05-21

Elastic Database Pools

W Azure można zdefiniować pulę baz danych i przypisać jej pewne gwarantowane zasoby DTU (Database Transaction Units). Można posiadać więcej pul i działanie baz w jednej puli nie ma wpływu na działanie baz w drugiej puli. Dzięki temu unikniesz przydzielania zasobów indywidualnie dla każdej bazy danych, a co za tym idzie przeszacowania zasobów.

Database Transaction Unit – DTU

Istnieją miary względne/umowne (np jeden metr) oraz bezwzględne (np kąt prosty). Określając wydajność baz w Azure przyjęto miarę „jednej transakcji”. Wykupując dostęp do bazy określasz jej DTU.

Elastic Database Trasaction Unit  – eDTU

Jeżeli baza znajduje się w elastic database pool, to przyznajesz jej pewną ilość eDTU. Nie oznacza to jednak, że baza rzeczywiście konsumuje tą ilość DTU. Baza, tóra nie jest używana pozostawia swoje DTU dla pozostałych baz w puli.

By Rafał Kraik in SQL 2016

SQL 2016. Funkcja FORMATMESSAGE. O jakie to fajne!

2016-05-20

Od lat programiści byli przyzwyczajeni do przygotowania napisów do wyświetlenia w interfejsie użytkownika z wykorzystaniem SPRINT lub SPRINT-o podobnych funkcji. Właściwie taką właśnie funkcją była i jest RAISERROR. Można np. w taki sposób zgłosić informację o usunięciu rekordów:

RAISERROR(’%d records have been deleted from table %s’,10,1,12345,’app_log’)

Oczywiście najczęściej liczba 12345 i napis 'app_log’  byłyby tu postawiane dynamicznie przez wyliczone wcześniej zmienne.

Gorzej, jeśli chciałeś przygotować podobny napis, ale nie wyświetlać go od razu. Właściwie jedyne co pozostawało, to zwykła konkatenacja ze znakiem + i zabawa z CAST lub CONVERT jeżeli trzeba było połączyć napis z liczbą. I wiecie co? W Microsoft też to zauważyli. Od wersji 2016 dostajemy funkcję FORMATMESSAGE. Działa jak wspomniany wcześniej RAISERROR, ale nie wyświetla napisu, tylko go zwraca, więc można jej użyć w zapytaniach, czy funkcjach itp.:

DECLARE @rowsDeletedINT = 12345

DECLARE @message VARCHAR(1000)

SET @message = FORMATMESSAGE(’%d records have been deleted from database %s, @rowsDeleted, DB_NAME())

SELECT @message

sql_2016_format_message

By Rafał Kraik in SQL 2016

Nowe oferty pracy w IBM

2016-04-24

Zapraszam do zapoznania się z ofertami pracy IBM Katowice i Wrocław. Prezentuję głównie SQL / Oracle / Windows / Development, ale przecież dostępnych stanowisk jest o wiele więcej…. Wypróbuj, zaaplikuj, może niebawem będziemy pracować w jednym teamie?

Coś dla SQL-owców:

Coś dla Oraclowców:

Coś dla administratorów Windows

Coś dla studentów:

Coś dla Developerów

I dla architektów:

Więcej ofert: Oferty pracy w IBM

 

Kurs PowerShell dla administratorów Windows po polsku dla początkujących – PROMOCJA!

2016-04-24

Masz ochotę w końcu poznać PowersShella, z którym spotykasz się raz po raz w różnych sytuacjach? Denerwuje Cię, że co druga instrukcja w Internecie każe Ci uruchamiać, których nie znasz? Masz już dość wykonywania powtarzalnych czynności podczas, gdy koledzy potrafią to samo zrobić raz dwa z wykorzystaniem Powershella?

Skorzystaj z kursu „Powershell dla administratorów Windows”! Kurs zaczyna się od podstaw i co bardzo ważne – jest po polsku! Codziennie 10 minut poświęcone na naukę na pewno pozwoli Ci w którkim czasie poznać ten język i zacząć samodzielnie pisać własne skrypty.

Skorzystaj z kuponu promocuyjnego „SPRING”, a cena spadnie do 10$. Kupon waży do końca maja. Szczegóły: http://www.kursyonline24.eu/

udemy_coupon

 

Powershell: Porównanie grup użytkowników

2016-03-27

Problem: Masz użytkownika UserA. UserA należy do pewnych grup AD. Jest nowy uytkownik UserB, który docelowo powinien należeć do tych samych grup, co userA. Członkostwo  wpewnych grupach zostało już nadane, a w innych jeszcze nie. Musisz sporządzić listę grup, do których należy userA, a userB nie (i odwrtonie).

Rozwiązanie:

Skorzystamy z modułu ActiveDirectory. Możesz go załadować poleceniem

Import-Module ActiveDirectory

ale jeśli masz powershell 4.0 lub nowszy to pierwsze odwołanie się do polecenia z tego modułu spowoduje jego załadowanie. Potrzebne nam polecenie to Get-ADPrincipalGroupMembership, które pozwoli uzyskać listę grup do których należy wskazany parametrem użytkownik. Ponieważ nie interesuje nas nic więcej niż nazwa grupy, to po pobraniu nazwy użytkownika można po prostu przesłać wynik do polecenia select, które pobierze jedynie właściwość name i awansuje ją do rangi obiektu (służy do tego parametr -Expand).

Podczas porównywania zawartości list z nazwami grup skorzystamy z metody Contains. Contains wywoływane na rzecz listy napisów, sprawdza czy przekazywany argumentem napis jest elementem tej listy. Oto i skrypt: Czytaj dalej »

By Rafał Kraik in Power Shell

Powershell: Formatowanie napisów

2016-03-27

Jak wiesz w Powershell mamy dostęp do wszystkich funkcji .NET. A zbiór funkcji .NET dotyczący formatowania napisów jest naprawdę olbrzymi! Wystrczy przyjrzeć się dokumentacji funkcji ToString(), która potrafi zrobić napis praktycznie ze wszystkigo. Oczywiście do zbudowania ładnego napisu w powershell nie trzeba znać wszyskich możliwych funkcji. Oto jedn użyteczny przykład:

[string]::Format("Value {0:0.00} and value {1:p}", 1.23, 0.45)

Wywołujemy tutaj fukcję statyczną typu string. Wywołanie buduje się w ten sposób, że do nazwy typu po podwójnym dwukropku dodajesz nazwę funkcji, u nas:

[string]::Format

No i teraz najciekawsze, czyli jak wyglądają argumenty funkcji Format. Czytaj dalej »

By Rafał Kraik in Power Shell