SQL: bcp: [Microsoft][SQL Native Client]I/O error while reading BCP format file

2016-05-23

Podczas standardowego uruchomienia bcp a plikiem format pojawiał się komunikat o błędzie:

[Microsoft][SQL Native Client]I/O error while reading BCP format file

Zazwyczaj I/O error oznacza, że pliku nie można odczytać, bo np nie ma go we właściwym katalogu, jest literówka w nazwie, albo plik jest, ale brakuje do niego uprawnień. Jednak tym razem wszystkie te przyczyny nie były prawdziwe.

Składnia pliku formatu wymaga, aby po ostatniej linii nacisnąć enter. Jeśli tej jednej dodatkowej pustej linii w pliku formatu nie ma, to pojawia się błąd I/O error…

By Rafał Kraik in SQL

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