Przemyślenia powstałe podczas tworzenia programów w Clarionie.

sobota, 27 grudnia 2008

15 wskazówek do zwiększenia wydajności pracy z serwerem sql

Oryginalny artykuł dostępny jest pod adresem:
http://www.simple-talk.com/sql/performance/performance-tuning-tips-for-database-developers/

  1. Ustawiaj klucz główny, dla każdej tabeli którą tworzysz. Dopóki nie będziesz posiadał odpowiedniej wiedzy aby wymyślić coś lepszego, zadeklaruj go jako indeks klastrowy (warto pamiętać, że jeśli ustawimy klucz główny za pomocą narzędzia Enterprise Manager będzie on domyślnie tworzony z indeksem klastrowym).
  2. Każda kolumna, która przechowuje klucz obcy powinna posiadać indeks. Jeśli wiesz, że ten klucz będzie unikalny, wymuś na indeksie, aby też taki był.
  3. Nie indeksuj niczego więcej.
  4. Gdy odwołujesz się do obiektów w zapytaniach TSQL, zawsze podawaj kwalifikator ich właściciela (chyba że potrzebujesz innego rozwiązania). Korzystaj z DBO.SYSDATABASES zamiast samego SYSDATABASES.
  5. Na początku każdej procedury składowanej ustawiaj SET NOCOUNT (a na końcu SET NOCOUNT OFF).
  6. Dokładnie przemyśl potrzebę korzystania z blokad. Jeśli nie tworzysz oprogramowania bankowego, czy będzie miało znacznie jeśli wystąpi brudny odczyt (ang. dirty read)? Możesz zastosować NOLOCK, ale często dużo łatwiej jest ustawić na początku procedury SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED, a następnie przywrócić ustawienia za pomocą READ COMMITTED na jej końcu.
  7. Pewnie słyszałeś już to milion razy, ale pobieraj tylko te kolumny i wiersze, których w danym momencie naprawdę potrzebujesz.
  8. Korzystaj z transakcji kiedy wydaje się to odpowiednie, ale nie pozwól żeby jakikolwiek użytkownik mógł wpłynąć na jej wykonanie. Osobiście staram się wykonywać wszystkie transakcje wewnątrz procedur składowanych.
  9. Jeśli tylko możesz, unikaj tabel tymczasowych. Jeżeli jednak będziesz ich potrzebować, twórz je wykorzystując jawne wywołanie CREATE TABLE #TEMP.
  10. Staraj się nie korzystać z NOT IN, zamiast tego stosuj LEFT OUTER JOIN. Nawet wtedy gdy łatwiejsze i czytelniejsze wydaje się wykorzystanie NOT IN.
  11. Jeśli upierasz się przy stosowaniu dynamicznego sql (konkatenacja stringów) wykorzystuj do tego nazwane parametry oraz SP_EXECUTESQL (zamiast EXEC), dzięki temu masz szansę na ponowne użycie planu wykonania zapytania (ang. query plan). Uproszczeniem byłoby powiedzieć, że procedury składowane są odpowiedzią na każdy problem, jednak z duża dozą prawdopodobieństwa można stwierdzić, że za ich pomocą nie da się zrobić czegoś źle.
  12. Wyrób w sobie nawyk kontrolowania swojego kodu przed oraz po każdej jego zmianie (narzędzie SQL Server Profiler). Mając na uwadze rodzaj wprowadzonych zmian, sprawdź czy wykorzystanie procesora, odczyty i zapisy serwera nie wzrosły o więcej niż 10-15%. Jeśli tak, to najprawdopodobniej procedura będzie wymagała przemyślenia.
  13. Jeśli to tylko możliwe, staraj się ograniczać liczbę zapytań kierowanych do serwera. Jedną z metod jest formułowanie zapytania tak, aby serwer za jednym razem zwrócił większy zbiór wyników.
  14. Unikaj stosowania wskazówek dla indeksów oraz złączeń.
  15. Kiedy skończysz pisanie kodu, ustaw program Profiler tak aby monitorował zapytania tylko z Twojego komputera, następnie uruchom swoja aplikację od początku do końca. Sprawdź liczbę zapisów oraz odczytów, a także liczbę odwołań do serwera. Postaraj się wychwycić nietypowe zachowania procedury. Bardzo często można zauważyć wywołania procedur już niewykorzystywanych albo wywołania podwójne. Postaraj się przeanalizować swoje spostrzeżenia razem z administratorem bazy.

Dodanie zer przed ciągiem znaków tak aby miał określoną długość

Aby dodać, np. zera przed ciągiem znaków tak aby cały ciąg miał 13 znaków, możemy posłużyć się następującymi instrukcjami:

SELECT RIGHT(REPLICATE('0', 13) + 'ciag', 13)

SELECT REPLICATE('0', 13 - CHARINDEX('.', 'ciag' + '.')) + 'ciag'

środa, 17 grudnia 2008

SQL ciag dalszy .... operacje na macierzach, łańcuchach znaków, zabawa z XML

Operacje na macierzach w SQL np mnozenie 2 macierzy o wymiarach 5x5 - robil to moze ktos z was na papierze ?
a w sql takie prosciutkie:

http://www.simple-talk.com/sql/t-sql-programming/sql-server-matrix-workbench/


polecam tez lekture innych artykułów z tej strony : http://www.simple-talk.com/default.aspx


Pierdoły o ktorych wiecznie zapominam

==========================================================
1. ComboBox - wybór z listy:
Zawartosc pola "From":
'Cywilny|#1|Grodzki|#2|Gospodarczy|#3'

==========================================================
2. Podstawowe metody easyExcel (nigdy mi sie nie chce szperac w dokumentacji):
EXLClass.Init(true,true,false) //Inicjowanie obiektu EE
(widoczny, pokazuj bledy, nowa instancja excela)
EXLClass.OpenWorkbook(sciezkadoexcela, false,,, true) //otworzenie istniejacego pliku
(sciezka, tylko do odczytu,haslo do otwarcia,haslo do zapisu,dodaj do ostatnio otwartych plikow, uaktualnienie linkow cokolwiek to znaczy)
EXLClass.AddWorkbook //nowy arkusz
EXLClass.SelectSheet(1) //wybor istniejacego arkusza
EXLClass.Write(2,1,'Lp.',false,true) //zapis do komorki 2 wiersz 1 kolumna
(wiersz, kolumna, wartosc, zapis bez formatowania, zaznaczanie komorki)
EXLClass.GetCell(2, 1, OdczytanaWartosc, Cell:Text) //pobranie wartosci z komorki
(wiersz, kolumna, wartosc, co zwrocic z komorki)
EXLClass.SelectRange(2,1,licznik+1,8) //zaznaczenie:
startrow,startcol,endrow,endcol
EXLClass.AutoFit //outodopasowanie wg ww. zaznaczenia

EXLClass.QUIT
EXLClass.Kill

=========================================================
3. Daty w excelu z Easy excel

EXLClass.Write(licznik,6,EXLClass.Date2Excel(TA:DataZwrotuWpisu),,false)
zapis - format(data,@d17)
odczyt - bez formatow

Zewnętrzny serwer SQL

czasami przyda sie przy transferach danych miedzy roznymi serwerami SQL:

EXEC sp_addlinkedserver
@server='nasza nazwa zdalnego',
@srvproduct='',
@provider='SQLNCLI',
@datasrc='adres ip zdalnego'


exec sp_addlinkedsrvlogin
@rmtsrvname = 'nasza nazwa zdalnego - ta sama jak wyzej',
@useself = 'TRUE',
@locallogin = 'lokalny login do zdalnego',
@rmtuser = 'login do zdalnego' ,
@rmtpassword = 'haselko do zdalnego'

select * into [tabele na bierzacym serwerze] from testowy.baza.dbo.zdalnatabela


Jedna wazna uwaga - na lokalnym serwerze musimy byc zalogowani na sql Autentication
(windows logon nie dziala)

wtorek, 16 grudnia 2008

Programowianie w SQL ciekawa strona

Grzebiąc w sieci znalazłem miejsce gdzie jest opisane kilka ciekawych programików w SQL:

http://blogs.lessthandot.com/index.php/DataMgmt/DataDesign/the-ten-most-asked-sql-server-questions--1#1

wsród nich:
problem z dnia dzisiejszego w pracy jak w jendej kolumnie uzyskac zawartosc z wielu wierszy nie robiąc tego na kursorze.
Wypelnianie tabeli danymi ze zmiennej elementami oddzielonymi przecinkiem (skąd my to znamy ;))
Wyciecie ze zmiennej coś do jakiegoś znaku lub od jakiegoś nazku np wszystko do pierwszej spacji lub wszystko od ostatniej spacji

Przykład użycia instrukcji PIVOT

i wiele innych. Polecam lekturę

Współtwórcy