Tabloya En Son Ne Zaman Erişim Yapıldığını Sorgulama

SQL Server performans çalışmalarında sorulan soruların nerede ise başında “hangi tabloya ne zaman erişim sağlandı?” sorusudur. Aşağıdaki sql sorgusu tabloya ne zaman erişim sağlandığını gösterir.

SELECT DB_NAME(ius.[database_id]) AS [Database],
OBJECT_NAME(ius.[object_id]) AS [TableName],
MAX(ius.[last_user_lookup]) AS [last_user_lookup],
MAX(ius.[last_user_scan]) AS [last_user_scan],
MAX(ius.[last_user_seek]) AS [last_user_seek],
MAX(ius.[last_user_update]) AS [last_user_update]
FROM sys.dm_db_index_usage_stats AS ius
WHERE ius.[database_id] = DB_ID()
--AND ius.[object_id] = OBJECT_ID('YourTableName')
GROUP BY ius.[database_id], ius.[object_id]

Sorgu sonucunda gelen kolonların açıklaması:

  • last_user_lookup: Index olmayan bir kolon üzerinde where şartı ile sorgu çalıştığı zaman
  • last_user_scan: Tabloyu sıralı okuduğu zaman, “select * from Table” sorgusu gibi
  • last_user_seek: Tablodan tek değer okunduğu zaman, “select * from Table where Id = 5” sorgusu gibi

Tabloya En Son Ne Zaman Erişilmiş?




SQL Server Hesaplanmış Kolon Oluşturma




SQL Server Kolon Değerine Şart Ekleme

Veritabanı özelliklerinden biri de veri tutarlılığını sağlamaktır. Veritabanı tutarlılığı içinde uygulanan özelliklerden biri de kolona atanabilecek değer üzerine şart koşmaktır. Bu işlem SQL Server da SQL CHECK Constraint özelliği ile yapılmaktadır.




C# İle SQL Server İşlemleri

Yazılım geliştirme çoğunlukla veri saklama ve işleme amacıyla yapılır. Verilerin saklanması içinde bir veritabannı sistemi kullanılır. Videomuzda en çok kullanılan veritabanı sistemlerinden olan SQL Server’a C# ile işlem yapmayı öğreneceğiz.




SQL Server Mail Gönderme




SQL Server Database Mail Konfigurasyonu




Nesnelerin SQL Server Üzerinde Kullandığı RAM Miktarını Bulma

SQL Server üzerinde yer alan veritabanı ve diğer nesnelerin ne kadar sistem kaynağı tükettiğini bulmak için aşağıdaki iki temel sorguyu kullanabiliriz.

İlk sorgumuzda veritablanı bazında kullanılan RAM miktarını sorgulayabiliriz.

SELECT
[DatabaseName] = CASE [database_id] WHEN 32767
THEN 'Resource DB'
ELSE DB_NAME([database_id]) END,
COUNT_BIG(*) [Pages in Buffer],
COUNT_BIG(*)/128 [Buffer Size in MB]
FROM sys.dm_os_buffer_descriptors
GROUP BY [database_id]
ORDER BY [Pages in Buffer] DESC;

Veritabanı Kullanılan RAM Sorgusu

Diğer sorgumuzda ise Index ve benzeri diğer nesnelerin kullandığı RAM miktarını sorgulayabiliriz.

SELECT obj.name [Object Name], o.type_desc [Object Type],
i.name [Index Name], i.type_desc [Index Type],
COUNT(*) AS [Cached Pages Count],
COUNT(*)/128 AS [Cached Pages In MB]
FROM sys.dm_os_buffer_descriptors AS bd
INNER JOIN
(
SELECT object_name(object_id) AS name, object_id
,index_id ,allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.hobt_id
AND (au.type = 1 OR au.type = 3)
UNION ALL
SELECT object_name(object_id) AS name, object_id
,index_id, allocation_unit_id
FROM sys.allocation_units AS au
INNER JOIN sys.partitions AS p
ON au.container_id = p.partition_id
AND au.type = 2
) AS obj
ON bd.allocation_unit_id = obj.allocation_unit_id
INNER JOIN sys.indexes i ON obj.[object_id] = i.[object_id]
INNER JOIN sys.objects o ON obj.[object_id] = o.[object_id]
WHERE database_id = DB_ID()
GROUP BY obj.name, i.type_desc, o.type_desc,i.name
ORDER BY [Cached Pages In MB] DESC;

Nesnelerin Kullandığı RAM Miktarı




Server Management Objects (SMO) İle SQL Server Kontrolü

Server Management Objects, .Net framework kullanarak SQL Server‘ı bütün yönleri ile yönetebileceğiniz yazılımlar geliştirmenizi sağlayan bir kütüphanedir. Örneğin aşağıdaki kod parçası ile sunucu üzerinde kolayca bir veritabanı oluşturuyoruz.

SMO kütüphanesini kullanabilmek için öncelikle Nuget üzerinden Microsoft.SqlServer.SqlManagementObjects projemize referans olarak eklememiz gerekmektedir.

SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=True");
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Server server = new Server(serverConnection);

Database database = new Database(server, "Smo");
database.Create();

Bu kod ile sınıcı üzerinde Smo adında bir veritabanı oluşur.

Şimdi de başka bir işlem olan tablo oluşturma işlemi yapalım.

SqlConnection sqlConnection = new SqlConnection("Data Source=localhost;Integrated Security=True");
ServerConnection serverConnection = new ServerConnection(sqlConnection);
Server server = new Server(serverConnection);

Database workDatabase = server.Databases["Smo"];

Table table = new Table(workDatabase, "People");

Column idColumn = new Column(table, "Id", DataType.Int);
idColumn.Identity = true;
table.Columns.Add(idColumn);

Column nameColumn = new Column(table, "Name", DataType.NVarChar(50));
nameColumn.Nullable = false;
table.Columns.Add(nameColumn);

table.Create();

Bu kod ile server nesnesi üzerinde Smo veritabanını seçtikten sonra bu veritabanını parametre olarak verdiğimiz Tablo tipinde bir table nesnesi oluşturuyoruz. Daha sonra bu table nasnesini parametre olarak verdiğimiz ilgili kolonları oluşturup table.Create() ile veritabanını oluşturuyoruz.

Server Management Objects ile diğer işlemleri aşağıdaki videoda inceleyebilirsiniz

SMO İncelemesi

SMO video kodları:

https://github.com/saitorhan/ServerManagementObjects




SQL Server Maintance Plans ve Operatore Plan Sonucunda Mail Gönderme




Veri Tabanı Tablosundan Entity Class Oluşturma

Veri tabanı işlemlerinin gerçekleştirildiği yazılımlarda tabloların entity C# sınıfları gerekebilmektedir. Her ne kadar Visual Studio içerisinde barındırdığı araçlar ile bunu otomatik yapıyorsa da T-SQL kodları kullanılarak da ilgili sınıf SQL Server tarafında oluşturulup kopyala – yapıştır ile projeye eklenebilir.

Aşağıdaki T-SQL kodu içerisinde ilk satırdaki ‘TableName’ yerine tırnaklar içerisine sınıf karşılığı oluşturulacak tablo yazılıp çalıştırıldığında print komutu ile oluşturulan sınıf ekrana gelecektir.

declare @TableName sysname = 'TableName' 

declare @Result varchar(max) = 'public class ' + @TableName + ' 

{' 

select @Result = @Result + ' 

    public ' + ColumnType + NullableSign + ' ' + ColumnName + ' { get; set; } 

' 

from 

( 

    select  

        replace(col.name, ' ', '_') ColumnName, 

        column_id ColumnId, 

        case typ.name  

            when 'bigint' then 'long' 

            when 'binary' then 'byte[]' 

            when 'bit' then 'bool' 

            when 'char' then 'string' 

            when 'date' then 'DateTime' 

            when 'datetime' then 'DateTime' 

            when 'datetime2' then 'DateTime' 

            when 'datetimeoffset' then 'DateTimeOffset' 

            when 'decimal' then 'decimal' 

            when 'float' then 'float' 

            when 'image' then 'byte[]' 

            when 'int' then 'int' 

            when 'money' then 'decimal' 

            when 'nchar' then 'char' 

            when 'ntext' then 'string' 

            when 'numeric' then 'decimal' 

            when 'nvarchar' then 'string' 

            when 'real' then 'double' 

            when 'smalldatetime' then 'DateTime' 

            when 'smallint' then 'short' 

            when 'smallmoney' then 'decimal' 

            when 'text' then 'string' 

            when 'time' then 'TimeSpan' 

            when 'timestamp' then 'DateTime' 

            when 'tinyint' then 'byte' 

            when 'uniqueidentifier' then 'Guid' 

            when 'varbinary' then 'byte[]' 

            when 'varchar' then 'string' 

            else 'UNKNOWN_' + typ.name 

        end ColumnType, 

        case  

            when col.is_nullable = 1 and typ.name in ('bigint', 'bit', 'date', 'datetime', 'datetime2', 'datetimeoffset', 'decimal', 'float', 'int', 'money', 'numeric', 'real', 'smalldatetime', 'smallint', 'smallmoney', 'time', 'tinyint', 'uniqueidentifier')  

            then '?'  

            else ''  

        end NullableSign 

    from sys.columns col 

        join sys.types typ on 

            col.system_type_id = typ.system_type_id AND col.user_type_id = typ.user_type_id 

    where object_id = object_id(@TableName) 

) t 

order by ColumnId 

set @Result = @Result  + ' 

}' 

print @Result