Arda Çetinkaya Yazılım ve arada kendim ile ilgili karaladıklarım…

Veritabanı uygulamaları yapan her yazılımcı, bir şekilde zamanı geldiğinde; -ki kesin gelir, veritabanı üzerinde çeşitli performans kriterlerine dikkat etmek durumda kalır. Çeşitli kontroller ile sistemin performansını ölçüp, gerekirse iyileştirmeleri bunların sonuçlarına göre yapar…

SQL Server ile uygulama geliştirirken zaman zaman kullandığım ve oldukça işime yarayan, hatta çoğu zaman hayat kurtarmaya bile destek sağlayan bir kaç SQL script’ini derledim. Benzerleri hatta daha faydalı olanlarını Google’da da çok rahat bulabilirsiniz. Burada benim işimi görenleri derleyip paylaşmak istedim, belki birilerinin daha işini görür.

En çok CPU tüketen 50 sorgu


select
 q.,
 SUBSTRING(q.text, (qs.statement_start_offset/2)+1,
 ((CASE qs.statement_end_offset
 WHEN -1 THEN DATALENGTH(q.text)
 ELSE qs.statement_end_offset
 END - qs.statement_start_offset)/2) + 1) AS statement_text,
 qs.last_execution_time,
 qs.execution_count,
 qs.total_worker_time/1000000 as total_cpu_time_sn,
 qs.total_worker_time/qs.execution_count/1000 as avg_cpu_time_ms,
 qp.query_plan,
 DB_NAME(q.dbid) as database_name,
 q.objectid,
 q.number,
 q.encrypted
from
 (select top 50
 qs.last_execution_time,
 qs.execution_count,
 qs.plan_handle,
 qs.total_worker_time,
 qs.statement_start_offset,
 qs.statement_end_offset
 from sys.dm_exec_query_stats qs
 order by qs.total_worker_time desc) qs
cross apply sys.dm_exec_sql_text(plan_handle) q
cross apply sys.dm_exec_query_plan(plan_handle) qp
order by qs.total_worker_time desc

En çok I/O yapan 50 sorgu


select
 q.,
 SUBSTRING(q.text, (qs.statement_start_offset/2)+1,
 ((CASE qs.statement_end_offset
 WHEN -1 THEN DATALENGTH(q.text)
 ELSE qs.statement_end_offset
 END - qs.statement_start_offset)/2) + 1) AS statement_text,
 qs.last_execution_time,
 qs.execution_count,
 qs.total_logical_reads as total_logical_read,
 qs.total_logical_reads/execution_count as avg_logical_read,
 qs.total_worker_time/1000000 as total_cpu_time_sn,
 qs.total_worker_time/qs.execution_count/1000 as avg_cpu_time_ms,
 qp.query_plan,
 DB_NAME(q.dbid) as database_name,
 q.objectid,
 q.number,
 q.encrypted
from
 (select top 50
 qs.last_execution_time,
 qs.execution_count,
 qs.plan_handle,
 qs.total_worker_time,
 qs.total_logical_reads,
 qs.statement_start_offset,
 qs.statement_end_offset
 from sys.dm_exec_query_stats qs
 order by qs.total_worker_time desc) qs
cross apply sys.dm_exec_sql_text(plan_handle) q
cross apply sys.dm_exec_query_plan(plan_handle) qp
order by qs.total_logical_reads desc

Index’lerin fragmentation oranları

Devam…

SQL Saturtday

5 Ekim 2013’de, İstanbul’da, Microsoft Türkiye ofisinde SQL ile ilgili oldukça geniş kapsamlı bir etkinlik var.  5 farklı paralel konu başlığı altında, SQL Server’ın çeşitli kırılımlarını bu etkinlik ile takip edebileceksiniz. Etkinliğe yurt dışından olarak gelen konuşmacılar da olacak. Dolayısıyla etkinlik dili İngilizce, bunu belirtmekte fayda var.

Etkinlik ile ilgili daha fazla bilgi ve kayıt için http://www.sqlsaturday.com/258/eventhome.aspx adresini ziyaret etmeniz yeterli olacaktır. Bir şekilde SQL Server ile çalışıyorsanız, mutlaka kaçırmamanız gereken bir etkinlik. Tavsiye ederim…

Etkinlik programı ve içeriğini aşağıdan takip edebilirsiniz.

Start Time Azure – Room: Mira BI – Room: Vega DBA – Room: Jupiter 1 DEV – Room: Jupiter 2 SQL Server 2014 – Room: Adara
08:30 AM SQLSaturday 258

Registrations

Level: Non-Technical

SQLSaturday 258

Registrations

Level: Non-Technical

SQLSaturday 258

Registrations

Level: Non-Technical

SQLSaturday 258

Registrations

Level: Non-Technical

SQLSaturday 258

Registrations

Level: Non-Technical

09:15 AM SQLSaturday 258

Opening Speech

Level: Non-Technical

SQLSaturday 258

Opening Speech

Level: Non-Technical

SQLSaturday 258

Opening Speech

Level: Non-Technical

SQLSaturday 258

Opening Speech

Level: Non-Technical

SQLSaturday 258

Opening Speech

Level: Non-Technical

09:45 AM Daniel Sol

Windows Azure for the DBA

Level: Beginner

David Peter Hansen

10 Tips and Tricks for better SSIS Performance

Level: Advanced

Işıl Efe

Performance Tuning with DMVs

Level: Intermediate

Andreas Wolter

“SQL Attack…ed” – SQL Server under attack.

Level: Advanced

Belkis Ozhorasan

Features Coming With Microsoft SQL Server 2014

Level: Beginner

11:00 AM Umit Sunar

Overview, Best Practices and Lessons Learned on SQL Server in Windows Azure Virtual Machines

Level: Intermediate

Oliver Engels Tillmann Eitelberg

Power Query: The ETL bit of Microsoft Self-Service BI

Level: Intermediate

Batuhan Yildiz

The Internals of SQL Server Wait Types

Level: Advanced

Sergey Olontsev

Query Optimizer and Statsitics

Level: Intermediate

Yigit Aktan

In-Memory OLTP Project (Hekaton) – A new Adventure

Level: Intermediate

12:00 PM SQLSaturday 258

Lunch Break

Level: Non-Technical

SQLSaturday 258

Lunch Break

Level: Non-Technical

SQLSaturday 258

Lunch Break

Level: Non-Technical

SQLSaturday 258

Lunch Break

Level: Non-Technical

SQLSaturday 258

Lunch Break

Level: Non-Technical

01:15 PM Daniel Sol

SQL Performance and Monitoring in Windows Azure at Scale

Level: Intermediate

Kagan Arca

Leveraging Hadoop Cluster from SSIS

Level: Advanced

Klaus Aschenbrenner

Fast your seatbelt – Troubleshooting the most difficult SQL Server problems

Level: Advanced

Denis Reznik

Deadlock detected! All is lost or it’s too early to sound the alarm?

Level: Intermediate

Niko Neugebauer

Clustered Columnstore – Introduction

Level: Beginner

02:30 PM Mihail Mateev

Spatial Data and Windows Azure SQL Database

Level: Intermediate

Koray Kocabas

Data Mining using SQL Server

Level: Advanced

Sibel Nal

Corrupt Database Adventures

Level: Intermediate

Turgay Sahtiyan

Top 10 Performance Tips for SQL Server Developers

Level: Intermediate

Niko Neugebauer

Deep Dive into Clustered Columnstore

Level: Advanced

03:45 PM Mihail Mateev

Power BI for Office 365 – a Complete Self-Service BI in the Cloud

Level: Intermediate

Mustafa Acungil

PMI and Agile Principals in BI Projects

Level: Non-Technical

Sergey Olontsev

Query Plan Operators Deep Dive

Level: Advanced

Tillmann Eitelberg Oliver Engels

Data Quality rulez! Integration and Performance be

Level: Advanced

Osman Cokakoglu Emrah Uslu

Business Intelligence and Data Visualization Enhancements

Level: Intermediate

05:00 PM SQLSaturday 258

Raffle

Level: Non-Technical

SQLSaturday 258

Raffle

Level: Non-Technical

SQLSaturday 258

Raffle

Level: Non-Technical

SQLSaturday 258

Raffle

Level: Non-Technical

SQLSaturday 258

Raffle

Level: Non-Technical

 

 

27 Eylül 2013’de, Agile Turkey, oldukça geniş bir içerikle, dünyada Agile yazılım metodu ile çalışan, konusunda hakim bir çok ismi güzel bir etkinlik için İstanbul’da bir araya getiriyor. Bütün gün sürecek, 8 parallel sunum ile Agile yazılım metodolijisinin dokunduğu her konu ile dolu dolu geçecek etkinlik, İstanbul’da gerçekleşecek. Konuşmacılar ve programın özetini aşağıda bulabilirsiniz. Etkinlik ne yazık ki ücretli ve ne yazık ki çabuk tükeniyor. Daha fazla ayrıntı ve bir an önce kayıt olmak için http://www.summit.agileturkey.org/ adresini ziyaret edebilirsiniz.

Agile Turkey Summit

Program

Untitled1

Process,Thread,Task,Parallel Programming falan derken, .NET Framework’ün yeni versiyonları ile sürekli bu konularda yeni özellikler geldi durdi. Bu yazıda bu özelliklerden bir tanesini, çok basit bir örnekle anlatmaya çalışacağım. Bir çoğunuz belki hali hazırda kullanıyorsunuzdur bile.

Multithread uygulama geliştirirken ya da biraz daha belirli olması adına, .NET’de Task‘lar ile uğraşırken, bazen Task’larımızı çeşitli senaryolara göre iptal edip durdurmamız gerekebilir. Bu iptal işleminden sonra, başka bir operasyonu tetikleyip akışı değiştirebilir, ya da Task’lar içerisinde dolaşacak objelerimizin durumlarını kontrol edebiliriz. Bu kadar derinlere girmeden bu iptal işini nasıl yapabiliriz buna bakıyor olacağız.

.NET 4.0 ile beraber gelen, CancellationTokenSource sınıfı, geliştirdiğimiz metodlarda iptal işlemlerini yapabilmemizi sağlayan oldukça basit bir alt yapı sunuyor.

Hepimizin zamanında oynadığı bir oyun üzerinden gidelim. Person X diye bir kişi olsun ve bu kişi 0’dan başlayıp içinden saysın, ta ki Person Y dur diyene kadar…Yani 2 tane farklı Task’ımız olacak. Bir tanesi basit bir döngü içerisinde sayıları sayma işlemini yapacak. Diğer Task’ımız da, t zamanında “DUR” diyecek. Bu senaryomuz da t zamanını da 1-5 saniye arası değişken bir zaman yapıp, biraz daha gerçekci hale getirebiliriz senaryomuzu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace CancellationDemo
{
    class Program
    {

        static void Main(string[] args)
        {

            CancellationTokenSource cancel = new CancellationTokenSource();

            Program p = new Program();

            //Sayma işlemini gerçekleştirecek Task'ı
            //başlatıyoruz. Dikkat ederseniz Task'a
            //parametre olarak "İptal" işini kontrol
            //eden CancellationTokenSource tipinde
            //yarattığımız nesneyi veriyoruz.
            var task1 = Task.Factory.StartNew(()
                => p.CountNumbers(cancel.Token), cancel.Token);

            //t zamanında "DUR" diyecek olan diğer
            //Task'ı başlatıyoruz.1-5 saniye arasında
            //bir zamanda CountNumbers metodunun
            //durmasına sebep olacak.
            var task2 = Task.Factory.StartNew(()
                => p.Stop(cancel));

            Console.ReadLine();
        }

        protected void CountNumbers(CancellationToken cancellationToken)
        {
            int number = 0;
            for (int i = 0; i < 100000; i++)
            {
                number = i;

                //Sayıları ekrana yazdırıyoruz.
                Console.WriteLine("Person X: "+ number.ToString());
                Thread.Sleep(80);

                //CancelationTokenSource tipindeki nesnemizin
                //CancelationToken tipindeki Token özelliğininden
                //IsCancellationRequested değerine bakıyoruz.
                //Bu değer eğer CancelationTokenSource nesnemizin
                //Cancel() metodu çağırılsa, iptal işleminin
                //gerçekleşmesi gerektiğini bildirmek adına
                //true olacaktır.
                if (cancellationToken.IsCancellationRequested)
                {
                    //İptal işlemi gerçekleşti
                    //Mevcut son sayıyı ekrana yazdıralım.
                    Console.WriteLine("Current number is:" + number.ToString());
                    break;
                }
                else
                {
                    Console.Clear();
                }
            }

        }

        //Sayma işlemini İptal edeceğimiz Task'ın metodu
        protected void Stop(CancellationTokenSource tokenSource)
        {
            //t zamanda iptal işlemini gerçekleştirmek
            //için Random olarak bir saniye değeri
            //üretiyoruz.
            Random waitTime = new Random();
            int seconds = waitTime.Next(1 * 1000, 6 * 1000);

           //Ürettiğimiz saniye kadar bekliyoruz.
            System.Threading.Thread.Sleep(seconds);
            Console.WriteLine("Person Y: STOP!!!!!!");

            //CancellationTokenSource objemizin Cancel()
            //metodunu çağırarak,CancellationTokenSource
            //nesnesine sahip olan diğer Task
            //işlemlerinin iptal edilmesi için ilgili
            //bildirimi yapıyoruz.
            tokenSource.Cancel();
        }
    }
}

Uygulamamızı çalıştırdığımız zaman aşağıdaki gibi bir ekran görüntüsü ile karşılaşıyor olacağız. t zamanından dolayı da her seferinde farklı sonuç veriyor olacaktır.

CancellationTokenSource

Oldukça basit bu kullanımı geliştirip, kendi çözümleriniz için kullanmanız mümkün. Bir senaryoda benim işime oldukça yaratı. Umarım size de faydalı olur…

Service Bus kavramını, Service-Oriented Architecture(SOA) yaklaşımı ile haşır neşir olanlar bir şekilde duymuş, hatta çeşitli tiplerini kullanmış bile olabilir. Service Bus kavramına, birbiri ile karşılıklı iletişim halinde olan, bu iletişimden dolayı çeşitli operasyonları paylaşan sistemleri tasarlamak ve geliştirmek için kullanılan bir model olarak çok yukarıdan bakabiliriz. Konuyu dağıtmamak için çok daha fazla derinlere girip Service Bus’ın ayrıntılarına girmek istemiyorum. Bu aşamada, bu basit tanım yeterli olacaktır.

Bu yazıda Windows Azure üzerindeki Service Bus’ı nasıl kullanabiliriz, hangi özelliklerinden nasıl faydalanabiliriz şeklinde, yine senaryo bazlı bir anlatımla, hem Windows Azure’u hem de Service Bus kavramını biraz anlatmaya çalışacağım. Hadi başlayalım…

Windows Azure’un sunduğu uygulama servislerinden biri de Service Bus. Bir birinden bağımsız ama ilişkili uygulamalar arasında iletişim kurmak adına kullanabileceğimiz bu servis kendi içinde, “Queue”, “Topics”, “Relay” ve şu an Preview olan “Notification Hub” şeklinde 4 alt kategoriye ayrılıyor. Bu yazıda “Topics” ile ilgili birşeyler paylaşıp, kullanım amacını özetlemeye çalışacağım.

Öncelikle Windows Azure’da ki Service Bus’ın “Topics” kavramı nasıl bir kavram bunu anlayalım. Publish/Subscription modeli olarak bilinen, bir sistemin yayınladığı şeyleri, bu sisteme üyelikle, üye olanların alabildiği bir model olarak ele alabiliriz “Topics”i…Bu modelde, sistemlerin yayınladığı/paylaştığı şeyler, direk olarak diğer sistemlere iletilmez. Yayınlanan şeyler, üye olanlara ara bir yapı ile iletilir. Bunun amacı, yayıncı ve alıcı arasındaki iletişimi bağımlılık değil de, ilişki şeklinde ele alabilmektir. İlişki kesildiği zaman iki sistem de, birbirlerine bağımlılığı olmadığı için işleyişlerini aksatmazlar. Windows Azure Service Bus’da bu ilişki “Topics”ler üzerinden yürütülmekte. Bir yayıncı bir “Topic”(konu diyelim) oluşturabiliyor. Windows Azure Service Bus sayesinde de, çeşitli client’lar, bu “Topic”e üye olup, bunun üzerinden ilişki sağlayabiliyor.

Biraz daha net olması adına, Queue kavramından örnek vermek isterim. Hem neden ihtiyaç olduğuna dair de netleşir belki. Queue kavramında, sıra mantığı işler bildiğiniz üzere. Sıraya konan verileri, bir istemci alır, daha sonra diğerini alacak şeklinde devam eder. Eğer veriyi başka bir istemci de almak isterse alamaz, çünkü o veri başka bir istemci tarafından alındığı için artık Queue’da değildir. Publish/Subsciption modelinde, paylaşılan veriyi üye olan herkes alabilir. Bu noktada “Topic”leri sıra mantığı olmayan ama Queue kavramına benzeyen kavramlar olarak ele alabiliriz.

Neyse bu kadar soyut şeyden biraz uzaklaşalım ve örneğimize geçelim. Şöyle bir senaryo oluşturalım; bir tane dergimiz olsun. Bu derginin sayılarını yaratalım çeşitli içerikle. Bu dergiye üye olanlar, yeni sayı çıktıkça ya da içerik eklendikçe üye oldukları için otomatikman haberdar olsunlar.

model

Öncelikle Windows Azure’da bunun için bir tane uygulama servisi,-ki bu Service Bus olacak, yaratmamız lazım. Bunun için Windows Azure Management Portal’dan aşağıdaki gibi bir Service Bus uygulamasını Topics alt kategorisi ile yaratmanız gerekmektedir.

topic
Servisi oluşturduktan sonra şimdilik, bağlantı sağlayabilmeniz için gerekli bağlantı bilgilerini almanız yeterli olacaktır. Konfigurasyon dosyamızı aşağıdaki gibi oluştrabiliriz.

connection

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
   <appSettings>
        <add key="ServiceBusConnectionString"
             value="BURAYA WINDOWS AZURE SERVICE BUS İÇİN ENDPOINT BİLGİSİNİ YAZMANIZ GEREKMEKTE" />
    </appSettings>
</configuration>

Öncelikle IssueContent adında, içeriğimizi belirtebileceğimiz basit bir sınıf yaratalım.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;

namespace ServiceBus.Common
{

    //Burada WCF ile uğraşmış kişilere çok tanıdık gelecek
    //Attribute'lar dikkatinizi çekecektir.
    //DataContract ve DataMember, paylaşılacak verinin
    //serialize edilip, service bus üzerinde paylaşılacak
    //olmasını belirtiyor. Eğer bu attribute'ları belirtmez
    //isek, kendi yarattığımız custom sınıfları Service Bus
    //üzerinden geçiremeyiz.

    [DataContract]
    public class IssueContent
    {
        [DataMember]
        public string Title { get; set; }

        [DataMember]
        public string Content { get; set; }

        public override string ToString()
        {
            return Title;
        }
    }
}

Devam…