Connection string için öneriler
http://ardalis.com/3-tips-to-improve-your-connection-stringsPek ç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 SHOWCONTIGmsdn.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=SQLNOLOCK 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
[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
Problem tespiti ve iyileştirmeler için
http://sqlserverplanet.com/dmv-queries/find-most-blocked-queries/
http://social.msdn.microsoft.com/Forums/en/sqldatabaseengine/thread/afec3c4c-3589-40f0-984a-354c14d90030
http://www.simple-talk.com/sql/performance/sql-server-wait-events-taking-the-guesswork-out-of-performance-profiling/
http://www.simple-talk.com/sql/performance/sql-server-wait-events-taking-the-guesswork-out-of-performance-profiling/
sp_Who ve Sp_Who2 nin ilerisi:
Diğer araçlar
PSSDIAG Data Collection Utility
http://support.microsoft.com/kb/830232
SQLIO Disk Subsystem Benchmark Tool
http://www.microsoft.com/downloads/details.aspx?familyid=9A8B005B-84E4-4F24-8D65-CB53442D9E19&displaylang=en
Hiç yorum yok:
Yorum Gönder