2 Aralık 2016 Cuma

Sql Server notları

Genel olarak karşılaşılan problemler ve var olan çözümlerde yapılabilecek iyileştirmeler için tutulan notlar.

Connection string için öneriler

http://ardalis.com/3-tips-to-improve-your-connection-strings

Pek çok veri yapısı problemine çözüm önerileri

http://www.databaseanswers.org/data_models/

Çok tablolu bir db de PK tanımlı olmayan tabloların lsitesini almak için:



SELECT DISTINCT i.NAME, 
                c.NAME, 
                Substring(Object_name(i.object_id), 2, Len(Object_name(i.object_id))) AS TableName
FROM            sys.indexes i , 
                sys.columns c 
WHERE           i.object_id=c.object_id 
AND             is_primary_key=1 
AND             c.NAME <>OBJECT_NAME(i.object_id) + 'Id' 
AND 
c.column_id=1 
AND 
c.NAME <>substring(object_name(i.object_id), 2, len(object_name(i.object_id))) + 'Id' ORDER BY tablename

OPENROWSET (BULK 'c:\filepath', SINGLE_CLOB) kullanımında dinamik dosya adresi verebilme

Tek bir dosya import edilmek isteniyorsa sıkıntı yok, zira BULK fonksiyonu sadece string değer kabul ediyor. Yani değişken verilemiyor. Bu durumda birden dosya import edilecekse dosya adının dinamik olarak belirtilebilmesi gerekli.
Bu adresde "Loading set of files into SQL Server" başlığı altında bir kullanım örneği verilmiş ama yazıyı yazan akıllı kendisine probleme çözüm bulamadığından BULK (@filepath) şeklinde bırakmış.
https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/10/07/bulk-importing-json-files-into-sql-server/

Problemin çözümü dinamik olarak sql sorgusunu çalıştırmak. Bu durumda dinamik sorgu içinden alınacak değerler de OUT ile dışarıya taşınmalı:

örnek:

DECLARE @sql  NVARCHAR(max)DECLARE @i    INT = 10DECLARE @json NVARCHAR(max)DECLARE @file VARCHAR(500)WHILE(@i
begin 
  SET @file = 'E:\f-' + cast(@i AS varchar(5)) + '.json'; 
  --SET @file = 'E:\f-0.json' 
  print @file 
  SET @sql = '  SELECT @json  = BulkColumn  FROM OPENROWSET (BULK ''' + @file + ''', SINGLE_CLOB) as j  ' 
  EXEC sp_executesql 
    @sql, 
    N'@json nvarchar(max) OUTPUT', 
    @json output; 
  insert INTO tablename 
  SELECT column1, 
         columnasjson AS columnasjson 
  FROM   openjson ( @json ) WITH ( column1 varchar(200) '$.column1', columnasjson nvarchar(max) AS json )
  SET @i = @i +1; 
end

Json import edilirken nested Json satırının da okunabilmesi
Üstteki örnekde her bir satırda Column1 adında string ve columnAsJson olarak json verisi var.
columnAsJson değerini okumak için as json olarak belirtmek gerekiyor.


Tabloların veri ve index'leri için fragmantasyonlarını gösteren script

DBCC SHOWCONTIG
msdn.microsoft.com/en-us/library/ms175008.aspx

DECLARE @TableName VARCHAR(255) 
DECLARE tablecursor CURSOR FOR 
  SELECT table_name 
  FROM   information_schema.tables 
  WHERE  table_type = 'base table' 

OPEN tablecursor 

FETCH next FROM tablecursor INTO @TableName 

WHILE @@FETCH_STATUS = 0 
  BEGIN 
      DBCC dbreindex(@TableName, ' ', 90) 

      FETCH next FROM tablecursor INTO @TableName 
  END 

CLOSE tablecursor 

DEALLOCATE tablecursor 

In-Memory  OLTP ile performans 

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2016/11/17/in-memory-oltp-in-standard-and-express-editions-with-sql-server-2016-sp1/?MC=SQL

NOLOCK ve commited read snapshot isolatin level


Snapshot isolation: A threat for integrity?
http://sqlblog.com/blogs/hugo_kornelis/archive/tags/Isolation/default.aspx

Nolock kullanımı: nolock kullanmanın en son çare olması gerektiği ve db de düzgün yürümüyorsa (yürütülemiyorsa) işler kullanılmasının tavsiye edildiği ve yorumların %95 inde (bir sürü başka kaynak) nolock kullanmaktan kaçınılması ile ilgili yarı resmi açıklama.

SQL Server NOLOCK Hint & other poor ideas.
http://blogs.msdn.com/b/davidlean/archive/2009/04/06/sql-server-nolock-hint-other-poor-ideas.aspx

Snapshot isolation level: yüksek trafikli siteler de yüksek oranda read varsa ve finansal uygulamalar gibi kesin sonuçlar gerekli değilse (transaction ların beklenmesi gerekmiyorsa) ve dirty read yapmamak için (nolock ile bu yapılıyor) + read commit a takılmamak ve nolock kullanımını sql i yazanın insafına da bırakmamak için önerilen database default isolation level: “READ_COMMITTED_SNAPSHOT”

Snapshot Isolation in SQL Server
https://msdn.microsoft.com/en-us/library/tcbchxcb(v=vs.110).aspx


Veritabanındaki tabloları satır sayılarıyla birlikte listeleyen sql


SELECT [TableName] = so.NAME, 
       [RowCount] = Max(si.rows) 
FROM   sysobjects so, 
       sysindexes si 
WHERE  so.xtype = 'U' 
       AND si.id = Object_id(so.NAME) 
GROUP  BY so.NAME 
ORDER  BY 2 DESC 



Bir tablonun hangi sp de kullanıldığını listelemek için;


SELECT ROUTINE_NAME, ROUTINE_DEFINITION
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE '%Project%'
AND ROUTINE_TYPE='PROCEDURE'


Performans İzleme


Monitoring performance by using the Query Store
  ALTER DATABASE TutorialDB SET QUERY_STORE = ON


Bir tabloda kolonların eklenme ve değiştirilme tarihleri:

SELECT obj.NAME, 
       col.NAME, 
       obj.create_date, 
       obj.modify_date 
FROM   sys.objects obj 
       INNER JOIN sys.columns col 
               ON obj.object_id = col.object_id 
ORDER  BY obj.modify_date DESC 


Tekrarlayan kayıtları bulmak ve temizleme


https://support.microsoft.com/en-nz/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server

Hiç yorum yok: