Microsoft SQL Server hakkında yazılar
SQL Server’da tablo oluştururken kolonu yanlış konumlandırdım diyenlerdenseniz doğru yazıyı okuyorsunuz. SQL Server’da bir tablo oluştururken kolonların sırasını yanlış konumlandırabilirsiniz. Ancak, kolonların sırasını değiştirmek oldukça kolaydır ve aşağıdaki örnek olarak yaptığım adımları izleyerek bunu yapabilirsiniz. Test Veritabanımızın altında bulunan “kisiler” tablosunu oluştururken sırasıyla “ad” ve “soyad” kolonlarını oluşturmak isterken önce “soyad” ardından “ad” kolonunu yazdığınızı varsayalım. Tabloyu silip tekrar oluşturmak veya kolon isimlerini değiştirmekte bir yöntemdir ancak burada içerisine çok sayıda veri yazılan bir tablo olduğunu varsayarak başka bir yöntem kullanacağım. Değişiklik yapmak istediğimiz tabloda “design” kısmına giriyoruz. Görüldüğü üzere “soyad” kolonu önce “ad” kolonu sonra yazılmış. Bunların yerini değiştirmek için “ad” veya “soyad” yazan yerlerin hemen sol tarafında bulunan ok işaretinden istediğimiz yere sürükleyip bırakıyoruz. Yapmamız gereken tek işlem bu aslında. Görüldüğü üzere kolonların yerleri değişti. Bu noktada yapılan işlemi kaydetmemiz lazım. Değişiklikleri kaydettiğimizde karşımıza aşağıdaki hata gelmektedir. Hata Mesajı: Değişikliklerin kaydedilmesine izin verilmez. Yaptığınız değişiklik aşağıdaki tablonun […]
Bu makalede Sql Server ’da metin tabanlı veriler üzerinde etkili arama performansı sağlayan Full-Text Search ’ten bahsedeceğim. Full-Text Search işlemlerini yapabilmesi için Full-Text index kolona sahip olmamız gerekmektedir. Full-Text indexler, metin içeriği barındıran ve belirli veri türlerine sahip kolonlarda oluşturulabilir. Bu veri türleri “Char, Varchar, NChar, NVarchar, Text, NText, XML, Varbinary, Image ” yer alır. Full-Text index oluşturulabilmesi için ilgili tabloda tek kolonlu bir unique bir index bulunması zorunlu bir koşuldur. Bu kısım biraz daha detaylandıralım, örnek olarak mevcut ortamda bulunan tablonuzda “Id” ve “Tarih” kolonları ile partition yapınız var bu yapıda mevcut partition index unique durumda bulunuyor ama yine de full-text index oluşturamıyorsunuz çünkü tek kolonlu bir unique index gerekmektedir. Benim test ettiğim yöntemlerden birisi de “Id” ve “Tarih” kolonları ile computed column oluşturarak bu kolona unique index oluşturmaya çalışmak oldu bu yöntem ile görece unique bir kolon oluşturarak bu kolona index oluşturulabilir ancak bu computed column oluştururken tablonuza […]
Bu makalede mevcut Failover Cluster yapısı kurulu olan bir sistemde Quorum Disk Witness ekleme işlemini ele alacağız. Quorum disk kurulumuna geçmeden önce Quorum yapısını ne olduğundan bahsedeyim. Mevcut clusterımızın ayakta kalması için cluster database dosyalarının tutulduğu kısımdır. Bu yapının çalışabilmesi için cluster yapımızda bulunan toplam sunucuların yarısından bir fazla ile sunucu oy hakkına sahip olur ve lider olarak ayağa kalkması sağlanır. Bu yapımız olmasa da olur aslında bir sıkıntı yaşamayız. Sorun şurada karşımıza çıkar iki sunucu aynı anda down oldu ve iki sunucu aynı milisaniye zamanında ayağa kalkmaya çalışırsa mevcut sistemimizin çalışmamasına sebep olur. Bu riskin önüne geçmek için Quorum yapısı oluşturulur. Bu yapılandırmayı yapmasak ta mevcut bir sunucu down olduğunda diğer sunucu up olmaktadır. Genellikle çift yapılı node durumların oluşturulur. İki farklı quorum modeli bulunmaktadır. Bunlar Disk Witness yapısı diğeri ise File Shared Witness yapısıdır. Herhangi bir failover cluster yapısı oluşturduğumuzda cluster’daki sunucularımın göreceği ortak bir iSCSI disk yapılandırılması […]
Bu yazımızda DMV ve DMF serisinin 3.’süne bakıyor olacağız. Konuya İlişkin daha detaylı bilgiye sahip olmak isterseniz ya da önceki serileri okumak isterseniz. SQL Server DMV ve DMF – I ve SQL Server DMV – II makalelerine göz gezdirilebilirsiniz. Bu yazımızda SQL Server üzerinde yoğun olarak kullandığımız ve SQL Operating system ile ilişkili bilgilere erişmek istediğimizde ihtiyacımız olan DMV ve DMF’lere göz gezdireceğiz. Bildiğiniz gibi DMV ve DMF’ler problem teşhisinde kullanıldığı gibi monitoring etmek içinde çokça kullanılmaktadır. Özellikle Operating system ile ilgili kullanmak istediğimizd sys.dm_os ile başlayanları kullanabiliriz. Peki biz hangi DMV’leri ne için ve nasıl okuyoruz? SQL Server’ın üzerinde koştuğu Windows’un bilgilerine ulaşmak için; SELECT * FROM sys.dm_os_windows_info; Görsel – 1 Windows_sku: Stock Keeping Unit Stock Keeping Unit değeri Windows_release sonucunun hexadecimal çıktısıdır. Görsel – 2 48 = 0x30 olduğunu biliyoruz. Bu değeri hesaplamak için Hexadecimal değeri Binary değere convert ederek elde edebilirsiniz. SQL Server ve üzerinde […]
DMV ve DMF serimizin 3. Serisinde sql server executionları arka planda çalışması sonucunda dataları performans anlamında nelere bakabileceğimizi ve bu parametreleri nasıl anlamlandırmamız gerektiğine bakacağız. Özellikle IO ve Memory dar boğazı yaşadığımız zamanlarda arka planda koşan sorgular büyük önem arz etmektedir. Bir önceki makalede kullandığımız DMV ve DMF’lerin detaylandırılmış ve bize hangi sonuçlarını verdiğini bu yazıda öğrenmiş olacağız. Özellikle Expensive Query olarak adlandırdığımız maliyetli sorguları kimi zaman sorun anında bulmak büyük sorunlar teşkil edebilmektedir. Sorunu doğru adreslediğimiz zaman çözüm noktasında ilerleme kaydetmiş oluyoruz. Şimdi hep birlikte performs dar boğazı yaratan sorguları nasıl bulabilirim konusunda bakalım. select top 50 coalesce (db_name(st.dbid), db_name(convert (int, pa.value)), ‘Empty’) as DBName, qs.last_execution_time as LastExecutionTime, SUBSTRING(st.text, (qs.statement_start_offset/2)+1, ((CASE qs.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END – qs.statement_start_offset)/2) + 1) AS StatementText, st.text as ProcedureTextOrBatchText, qs.execution_count as ExecutionCount, (qs.total_worker_time/1000) as CPUTimeTotal, ((qs.total_worker_time/1000)/qs.execution_count) as CPUTimeAvg, (qs.total_elapsed_time/1000) as DurationTimeTotal, ((qs.total_elapsed_time/1000)/qs.execution_count) as DurationTimeAvg, qs.total_physical_reads as PhysicalReadsTotal, (qs.total_physical_reads/qs.execution_count) as PhysicalReadsAvg, […]
Bu makalede Sql Server Database Mirroring kavramını ele alacağız. Uygulamalı olarak işlemlere başlamadan önce database mirroring kavramından bahsedelim. Sql server sunucusunda bulunan bir database’in anlık olarak başka bir sunucuya yazılma işlemidir. Bu işlem database bazlı yapılmaktadır. Bu kopyalama işlemi birden fazla sunucuya aynı anda yapılmaktadır. Mirroring yapılan veritabanımız iki sunucuda aynı büyüklükte ve yapıda tutulmaktadır. Primary olan sunucumuzun başına bir iş geldiğinde veritabanı otomatik veya manuel bir şekilde ikinci sunucuya devri olmaktadır. Ana sunucunun başına herhangi bir sıkıntı geldiğinde Witness sunucu vasıtasıyla yedek sunucu devreye giriyor. Bu işlem failover cluster yapısıyla benzer bir özellik taşır. Arada witness bağlantısı olmadığında da makinalar doğrudan birbirleriyle haberleşiyor. Burada ise failover işlemi otomatik olarak yapılmaz. Herhangi bir sorun anında manuel bir şekilde yapılmaktadır. Aşağıdaki resimde görüldüğü gibi arada herhangi bir bağlantımız yok. Mirroring durmuşsa, yeniden başlatılmadan önce primary veritabanındaki bütün transaction log backup’lar secondary sunucuya with no recovery ile restore edilmelidir. Sistem […]
Bazen partition yapılmış bir tabloya partition yapısını bozulmaması için yeni bir file group eklenme gereği duyulabilir. Bunun için elimizde bulunan partition scheme ve partition function yapısının düzenlenmesi gerekmektedir. Bir veritabanı altındaki partition yapılmış tabloyu aşağıdaki komut ile görebiliriz. use [PartSamp] SELECT OBJECT_NAME(si.object_id) AS object_name ,pf.NAME AS pf_name ,ps.NAME AS partition_scheme_name ,p.partition_number ,ds.NAME AS partition_filegroup ,rv.value AS range_value ,( CASE pf.boundary_value_on_right WHEN 0 THEN ‘RAGE_LEFT’ ELSE ‘RANGE_RIGHT’ END ) AS range_direction ,SUM(CASE WHEN si.index_id IN ( 1 ,0 ) THEN p.rows ELSE 0 END) AS num_rows FROM sys.destination_data_spaces AS dds INNER JOIN sys.data_spaces AS ds ON dds.data_space_id = ds.data_space_id INNER JOIN sys.partition_schemes AS ps ON dds.partition_scheme_id = ps.data_space_id INNER JOIN sys.partition_functions AS pf ON ps.function_id = pf.function_id LEFT JOIN sys.partition_range_values AS rv ON pf.function_id = rv.function_id AND dds.destination_id = CASE pf.boundary_value_on_right WHEN 0 THEN rv.boundary_id ELSE rv.boundary_id + 1 END LEFT JOIN sys.indexes AS si ON dds.partition_scheme_id = si.data_space_id LEFT JOIN […]
Bu makalede gerçek sistemde başka bir kurumdan servisle alınan bir veritabanında partition yapılması uygun görülen bir tablonun belirtilen kolununun partition yapılması amaçlanmaktadır. Şimdi işlemlerimizi uygulamalı bir şekilde gerçekleştirelim. Aşağıdaki resimde görüldüğü gibi veritabanımızda herhangi bir filegroup yapısının olmadığı bunun için partition yapacağımız tablo için database üzerinde filegroupları oluşturuyorum data file ile birlikte. Not olarak şunu geçmek istiyorum partition yapılacak kolunun not null olma şartı gerekmektedir. Yoksa tablomuzu partition oluşturacağımız zaman hata vermektedir. Gerçek sistemde yapmadan önce test veritabanında yapıyorum. Şimdi yapacağımız adımlar canlı sistemdeki veritabanına servis aracılığıyla veriler gelmekte bu veriler sonradan update edilmediği için bu yöntem yapılır. Adım olarak canlı veritabanımızda partition yapılacak kolundaki tarihleri gözlemleyerek filegroup’lar ve data file’lar ekliyorum. Tarih kolununu gözlemlediğimde 2021 yılı öncesi veriler ve ondan sonra 21-22,22-23 bu şekilde mantık çerçevesinde olması için ilk filegroup ismini FG2020 yapıyorum bu şekilde 7 tane filegroup ekleme işlemlerine geçiyorum. ALTER DATABASE [PartSamp] ADD FILEGROUP [FG2020] go ALTER […]
Bu makalede Sql Server ’da kaynak kullanımımız için farklı seçenekler ve değerlendirme fırsatları sunan Resource Governor yakından kullanım örneklerini göreceğiz. Günümüzde sistemlerimizin verimli kaynak kullanımı ve buna yönelik olarak çalışmalar oldukça önemli bir durumdadır. Bu kapsamda Veri tabanı sistemlerimizin kurulu olduğu sunucu kaynaklarımızdan maksimum faydayı ve verimi almaya çalışmaktayız. Bu kapsamda SQL Server veri tabanlarımızda kaynak (CPU, bellek, disk ve I/O) kullanımını yönetmek ve optimize etmek için kullanılan güçlü bir araç olan Resource Governor bizlere 2008 ve sonraki sürümlerde sunmaktadır. Bu sayede kritik iş yüklerinizin ihtiyaç duyduğu kaynaklara erişmesini sağlayabilir ve performansınızı optimize ederek veri tabanlarına gelebilecek aşırı yükü önlemiş olabilirsiniz. Biraz çalışma prensibinden bahsedelim, Resource Governor veri tabanı nesne ve sorgularında bir öncelik atayarak çalışır. Bunu şu şekilde örneklendirebiliriz sunucuya gelen uygulama sorguları var bunu servis kullanıcısı ile, raporlama sorguları var bunu raporlama kullanıcısı ile ve ilgili uygulamanın loglarının sorgulamasını yapan log kullanıcısı bulunmaktadır bu yapıda en öncelikli sorgularımız […]
Bu makalede, SQL Server Trace Flag ne olduğunu, nasıl kullanıldığını ve bazı yaygın senaryolarda nasıl faydalı olabileceğini inceleyeceğiz. Trace Flag Nedir ? SQL Server’ın davranışını değiştiren ve çeşitli senaryolarda performansı artıran veya hata ayıklama sürecini kolaylaştıran özel ayarlar olarak tanımlanabilir. Kullanım amaçları genel anlamda kriz anında ihtiyaçlara göre Trace Flags’ler eklenip problemi çözmeye yönelik işlemler yapılabilir. SQL Server Trace Flag seçerken dikkatli olmak önemlidir. Yanlış bir Trace flag etkinleştirilmesi, beklenmedik davranış değişikliklerine veya performans sorunlarına neden olabilir. Bu nedenle, her Trace Flag etkilerini ve kullanım senaryolarını bilmek önemlidir. Trace Flag etkinleştirildikten sonra sistem üzerindeki etkilerini izlemek ve değerlendirmek de önemlidir. Trace Flag nasıl aktif edebiliriz. Bağzı Trace Flag’ ler Service Restart edildikten sonra devreye girecektir. Aktif etmek için; SQL Server Configuration Manager/ SQL Server Services/ SQL Server (InstanceName) Instance’a sağ tıklayıp Properties diyoruz ve Startup Parameters kısmına geliyoruz burada 3 tane System tarafından Default olarak gelen Trace Flag’ler bulunmaktadır. […]