2010-11-16

SQL Server 2012 - T-SQL Paging

SQL Server 2012 ile birlikte gelen güzel özelliklerden birisi de T-SQL'de paging yapısı. Paging  ile istediğimiz sıradaki yada sıralar arasındaki kayıtları listeleyebileceğiz. Dilersek bu sıraları parametrik hale de getirebileceğiz.

Örnek-1: 10.kayıttan sonraki tüm kayıtları aşağıdaki T-SQL kodu ile alabiliriz.:

SELECT PersonID, FirstName, LastName
FROM Person
ORDER BY PersonID
OFFSET 10 ROWS

Örnek-2: 10  ile 20. kayıtlar arasındakı kayıtları aşağıdaki T-SQL kodu ile alabiliriz:

SELECT PersonID, FirstName, LastName
FROM Person
ORDER BY PersonID
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;

Syntax:

ORDER BY order_by_expression
[ COLLATE collation_name ]
[ ASC | DESC ]
[ ,...n ]
[ ]


 
 ::=
{
OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }
[
FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression } { ROW | ROWS } ONLY
]
}

2010-11-11

SQL Server 2011 (Code Name Denali)'nin CTP1'i Çıktı

SQL Server 2011'in CTP1 versiyonunu http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6a04f16f-f6be-4f92-9c92-f7e5677d91f9&displaylang=en adresinden indirebilirsiniz. SQL Server 'Denali' ile gelen yeniliklere http://msdn.microsoft.com/en-us/library/bb510411(v=SQL.110).aspx adresinden ulaşabilirsiniz.

Index Fragmentation

Bir tablo yada view'daki index ve data fragmantasyonunu sys.dm_db_index_physical_stats DMV'si ile alabilirsiniz.

Örnek-1: Test adlı veritabanımızdaki musteri adlı tablomuzun fragmantasyonu aşağıdaki SQL kodu ile alabiliriz:

select * from sys.dm_db_index_physical_stats(db_id('Test'),object_id('musteri'),null,null,null)

Örnek-2: Test adlı veritabanımızdaki tüm tablo ve view'lerimizin fragmantasyonu aşağıdaki SQL kodu ile alabiliriz:

select * from sys.dm_db_index_physical_stats(db_id('Test'),null,null,null,null)

Örnek-3: Tüm veritabanlarımızdaki tüm tablo ve view'lerimizin fragmantasyonu aşağıdaki SQL kodu ile alabiliriz:

select * from sys.dm_db_index_physical_stats(null,null,,null,null,null)

Fragmente oranı %30 dan büyük olan indexlerinizi rebuild etmenizi; %10-%30 arasında olan indexlerinizi ise reorganize etmenizi tavsiye ederim.

2010-11-04

Tüm Kullanici Veritabanlarının Boyutlarını Almak

Bir instance üzerinde bulunan tüm kullanici veritabanlarının boyutlarını aşağıdaki SQL kodu ile alabilirsiniz:

select db_name(database_id) DatabaseName,sum(size)*8/1024 DatabaseSizeMB
from sys.master_files
where database_id>4
group by db_name(database_id)

2010-10-26

Logical/Physical CPU Sayısını Bulma

SQL Server 2008 ve SQL Server 2008 R2 sürümlerinde logical/physical cpu sayısını aşağıdaki sql kodu ile alabilirsiniz:

SELECT cpu_count AS [Logical CPU Count],
hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count]
FROM sys.dm_os_sys_info;

2010-10-25

SQL Server Servis Account Adını Bulma

SQL Server'ı çalıştıran servis account'ını aşağıdaki gibi alıp öğrenebilirsiniz:

DECLARE @ServiceaccountName varchar(128)
EXECUTE master.dbo.xp_instance_regread
N'HKEY_LOCAL_MACHINE',
N'SYSTEM\CurrentControlSet\Services\MSSQLSERVER',
N'ObjectName',
@ServiceAccountName OUTPUT,
N'no_output'
SELECT @ServiceaccountName

SQL Server 2008 R2 SP1'den sonra gelen sys.dm_server_services DMV ile servisler ile ilgili bir çok bilgiye ulaşabilirsiniz. Benzer şekilde aşağıdaki T-SQL ile de servis account bilgisini alabilirsiniz:

select servicename, service_account
from sys.dm_server_services


2010-10-15

SQL Server'ın Başlatıldığı Zamanı Bulma

SQL Server'ın başlangıç zamanını SQL Server 2008 ile birlikte gelen sys.dm_os_sys_info DMV'i ile aşağıdaki gibi bulabilirsiniz:

SELECT sqlserver_start_time
FROM sys.dm_os_sys_info

SQL Server Error Log Dosyası Nerede?

SQL Server error log dosyasının adını ve dosyanın bulunduğu dizini aşağıdaki undocumented sql kodu ile alabilirsiniz:
SELECT SERVERPROPERTY('ErrorLogFileName')

2010-09-30

MS SQL Server 2008 Service Pack 2 (SP2) Çıktı

Microsoft daha önce 2010 yılının 4.çeyreğinde çıkaracağını duyurduğu SQL Server 2008 SP2'yi yayınladı.
SQL Server 2008 Service Pack 2'yi http://www.microsoft.com/downloads/en/details.aspx?FamilyID=8fbfc1de-d25e-4790-88b5-7dda1f1d4e17&displaylang=en adresinden indirebilirsiniz.

SQL Server 2008 Service Pack 2'de giderilen hataların listesini http://support.microsoft.com/kb/2285068 adresinden detaylı olarak inceleyebilirsiniz.

2010-09-16

Partition Tabloların Filegroup ve Diğer Bilgilerini Alma

Partition yapısındaki bir tablonun partition aralıklarını ve bu aralıkların hangi filegroup'ta tutulduğunu aşağıdaki sorgu ile alabilirsiniz:

select isnull(d.name,ps.name) FileGroupNameOrSchemeName
,isnull(d.type_desc , ps.type_desc ) FileGroupTypeOrSchemeType
,OBJECT_NAME(p.object_id) ObjectName
,p.rows
,p.data_compression_desc
,p.partition_id
,p.partition_number
,isnull(case when boundary_value_on_right =1 then '<' else '>' end + cast(minprv.value as varchar(100)),'~') + ' to '
+isnull( case when boundary_value_on_right =1 then '>='
else '<=' end + cast(prv.value as varchar(100)), '~') Criteria
,d2.name FilegroupName
from sys.partitions p join sys.indexes i on i.index_id = p.index_id and i.object_id = p.object_id
left join sys.data_spaces d on d.data_space_id = i.data_space_id
left join sys.partition_schemes ps on ps.data_space_id = i.data_space_id
left join sys.partition_functions pf on pf.function_id = ps.function_id
left join sys.partition_range_values prv on prv.function_id = ps.function_id and prv.boundary_id = p.partition_number
left join sys.partition_range_values minprv on minprv.function_id = ps.function_id and minprv.boundary_id = p.partition_number -1
left join sys.destination_data_spaces dds on dds.partition_scheme_id = ps.data_space_id and dds.destination_id = p.partition_number
left join sys.data_spaces d2 on d2.data_space_id = dds.data_space_id
where p.object_id=object_id('TabloAdi')

2010-09-12

Performans Counter'a Binlik Ayıracı Ekleme

Windows Vista'dan önceki işletim sistemlerinde perfmon'da binlik ayıracı default olarak yoktur ve bu eksiklik özellikle uzun sayıları okumamızda zorluk çıkartır. Perfmon'a binlik ayıracını aşağıdaki adımları uygulayarak ekleyebilirsiniz:
  1. Regedit'i çalıştırın.
  2. HKEY_CURRENT_USER\Software\Microsoft\SystemMonitor\ sekmesini açın.
  3. Edit menu'de New deyip DWORD değeri seçin.
  4. Oluşturduğunuz yeni alana "DisplayThousandsSeparator" adını verin.
  5. "DisplayThousandsSeparator" değerini 1 olarak set edin.
  6. Perfmon'u yeniden başlatın.

2010-08-24

Gmail'im Dışardan Mail Almaz Oldu, Tüm Maillerim Yolda Kaldı!

Sevgili dostlar,

Gmail'deki mail hesaplarına dünden beri mailler gelmiyor. Gmail'den başka bir adresteki mail hesaplarına mail gönderebiliyorsunuz fakat mail alamıyorsunuz. Bir süredir gmail'deki hesaba mail gönderdim hala gitmedi yada benim gibi gmail de mail beklediği halde maili gelmeyen arkadaşlara duyurulur.

2010-08-18

Veritabanı Yöneticileri Neler Yapar?

Bir DBA tipik olarak aşağıdaki konulardaki işlerle uğraşır:

- Veri Arşivleme
Verilerin boyutu zamanla artar. Bu artış disk üzerinde daha çok yer kaplamasına neden olup, performansı düşürüp yönetimi zorlaştırır. Bir DBA verinin boyutunu ve büyümesini izleyip gerekli yerlerde arşivleme yapmalıdır. Arşivleme işlemi için kullanılan yöntem aynı server üzerindeki farklı bir filegroup yada veritabanı olabileceği gibi farklı bir sunucu üzerindeki bir veritabanı da olabilir. Kullanılan yöntem kurum politikasına ve yasalara uygun olmalıdır.

- Toplantılara Katılma
Çoğu DBA toplantılardan nefret eder.Çünkü çalışmaya ve zamanla yarışmaya ihtiyacı vardır ve toplantıları zaman kaybı olarak görür. Toplantılar gerçek hayatın vazgeçilmezleri arasındadır. Bir DBA'nın diğer insanlarla ihtiyaçları konusundaki iletişimi ve çoğu kararı almasının ön adımı için toplantılara yeteri kadar vakit ayırması gerekir.

- Audit Yapma
Bir DBA için hangi kullanıcının nereye eriştiği, hangi kayıtı ekleyip, sildiği ve güncellediği hayati öneme haiz bir meseledir. Audit sadece belirli zaman dilimi, belirli kullanıcılar ve belirli veriler için olabileceği gibi tüm zamanlardaki tüm kullanıcılara ait hareketler de olabilir.

- Uygulama Entegrasyonu
Çoğu kurumda third party uygulamalar izole bir şekilde diğer uygulamalardan ayrı olarak çalışır. Bir DBA bu uygulamaların birbiriyle T-SQL veya SSIS paketleriyle konuşmasını sağlar.

- Backup ve Recovery
Bir DBA'nın en temel işlerinden birisi kurumun verilerini korumaktır. Bunu verilerin periyodik olarak yedeklenmesi şeklinde korur. Bunun için iyi bir geri dönüş planına ihtiyacı vardır. Bu planın yazılıp test edilmesi gerekir ve bir problem anında hızlı bir şekilde verilerin geri döndürülmesi gerekir. Bir DBA'nın en büyük hatalarından birisi aldığı backupları test etmemesidir! Çünkü alınan bir backup'ın restore edilebileceğinin bir garantisi yoktur. Bir DBA sadece backup almak yerine bu backuplarını başarılı bir şekilde restore da etmelidir.

- Business Intelligence/Data Warehousing
Business Intelligence(BI) ve Data Warehousing DBA'lığın en hızlı büyüyen alanlarından birisidir. Bu alan çok karışık olduğu için iyi disiplin altına alınmalı.

- Kapasite Planlama
Çoğu kurumda veritabanlarının sayısı ve büyüklüğü hızlı bir şekilde büyür. DBA veri büyümesini izlemeli ve büyümeye paralel planlar yapıp bu planları hayata geçirmeli. Bunu verileri arşivleyerek yapabildiği gibi mevcut storage'ı artırarak da yapabilir.

- Değişiklik Yönetimi
SQL Server konfigürasyonları, veritabanı şemaları, T-SQL kodlar ve diğer veritabanı bileşenleri zamanla değişir. DBA bu değişiklikleri önceden analiz edip gerekli testleri yaptıktan sonra hayata geçirmeli.

- Veritabanı Uygulaması Geliştirme
Bazı DBA'ler yönetim işlerini kolaylaştırmak için kendilerine özel uygulamalar geliştirirler.

- Veri Modelleme ve Veritabanı Tasarımı
Hızlı ve ölçeklenebilir veritabanlarını oluşturmak iyi veritabanı tasarımından geçer. Büyük kurumlarda işi sadece veritabanı tasarımı olan ve bu alanda uzmanlaşmış DBA'ler bulunur.

- Geliştirme ve Best Practice'leri Uygulama
İyi bir DBA proaktif olmak zorundadır. Proaktifliğin yolu ise best practice'leri uygulamaktan geçer. Bir kurumun best practice'leri yazılı olmalı ve bunlara uyulmalı.

- Yüksek Erişilebilirlik(HA)
Yüksek erişebilirlik clustering, mirroring, log shipping, replication vb gibi tekonolojilerle sağlabilir. Yüksek erişilebilirlik çok özel bilgi ve birikim gerektirir. Bu yüzden sırf bu alana yoğunlaşmış DBA'ler bulmak mümkündür.

- Kurulum, Konfigürasyon, Patch Geçişi ve SQL Server Yükseltme
Çok çok zaman alan DBA işlerinden birisidir. Patch geçme ve SQL Server sürüm yükseltme işlemleri karmaşık, riskli işlemlerdir. Bu işlerin iyi planlanıp iyice test edildikten sonra üretim ortamına alınması gerekir.

-Yük Dengeleme(Load Balancing)
Bir DBA server üzerindeki yükü izleyip gerektiğinde veritabanını çok yoğun bir sunucudan daha az yoğun olan bir sunucuya alabilir. Yük dengeleme için bir başka çözüm ise veritabanlarını konsolide etme veya sanallaştırmadır.

- Yapılan İşleri Dökümante Etme
Bir DBA için en sıkıcı işlerden birisi döküman yazmaktır. Fakat döküman yazmaktan korkmayın. Zira yazdığınız dökümanlar yeni DBA leri çin yol gösterici olabilir yada sizin işinizi kolaylaştırabilir.
- Yöneticileri Yönetme
Bir DBA hem kendi yöneticisi ile hem de diğer yöneticilerle iyi geçinmek zorundadır. Yöneticinize belirli periyotlarda yaptığınız işlerle ilgili düzenli raporlar sunup destek gereken noktalarda yöneticinizin desteğini almalısınız. Yaptığınız işin kritiktiğini ve yönettiğiniz verilerin değerini yöneticinize iyi anlatacak şekilde rehberlik etmelisiniz.

- Test Ortamlarını Yönetme
Büyük ölçekli kurumlarda test ortamını üretim ortamından oluşturmak ve test ortamlarını yönetimini yapmak DBA işidir.

- İzleme(Monitoring)
İzleme geniş kapsamlı bir iş olup performans izleme, log izleme, jobların düzgün çalıştığını izleme, error logları izleme vs izleme işlemlerini kapsar.

- Performans Tuning
Bir DBA performansı izleyip veritabanı performansını artırmanın yolları bulup uygular. Bir DBA'nın en önemli işlerinden birisi olup oldukça kapsamı geniş bir konudur. Sırf bu alanda uzmanlaşan DBA'ler bulunmaktadır.

- Proje Yönetme
Bir DBA iyi proje yönetme yeteneklerine haiz olmalıdır.

- Verilerin Korunmasını Sağlama
DBA ler bir kurum verilerin tutarlı ve doğru olmasını sağlamak için uğraşır.

- Veriyi Replike Etme
Bir DBA özel verileri(bir yada birden çok tablo olabilir) bir sunucudan diğer sunuculara belirli periyotlarla replike ederek taşır ve bu replikasyonu yönetir .

- Rapor Oluşturma
Verileri T-SQL sritpleri ile çekip reporting service üzerinde kullanıcıların kullanabileceği formatlı bir şekildeki raporları oluşturur. Bu alanda da uzmanlaşan DBA ler bulunmaktadır.

- Çalışan Joblar
Bir DBA bir sunucu üzerinde ihtiyacı olan SQL jobları oluşturup bu jobları yönetir. Bu job bir index rebuild, istatistik update, transaction log backup vs maintence plan olabilir.

- Security
Bir DBA SQL Server loginlerinin oluşturulması, bu loginlerin başka sunuculara taşınması ve bunların yönetiminden sorumludur.

- Scripting
Bir DBA kendi işine yarayacak T-SQL kod yazıp bunları geliştirir.

- SSIS/ETL
Bir DBA verilerin bir yerden başka bir yere taşınması için sıklıkla SSIS paketi kullanır.

- Test Yapma
Bir DBA veritabanı testleri, yönetim araçlarının testlerini yapar.

- Kullanıcıların Eğitilmesi
Bir DBA bilgilerini diğer DBA ler, yazılım geliştiriciler ve son kullanıcılarla paylaşır. Bu bilgi aktarımı bire bir aktarım şeklinde olabildiği gibi grup şeklinde eğitim sınıfı ayarlayarak ta sağlanabilir.

- Hata Bulma ve Giderme(Troubleshooting)
Bir DBA neredeyse her gün hata ayıklamayla uğraşır. Zaman zaman tüm işini bırakıp mevcut hata üzerinde odaklandığı zamanlar olur.

- Takım Arkadaşıyla Çalışma
Bir DBA nadiren yalnız başına çalışır. Bir DBA çoğu zaman yazılım geliştiricilerle, storage uzmanlarıyla, network uzmanlarıyla, test ekibiyle, dış kaynaklı firma elemanlarıyla, sistem uzmanlarıyla iletişim halindedir.

Yararlanılan Kaynak: How to Become an Exceptional DBA, Brad M McGehee, 2009

Makalenin görsel eklenmiş haline Çözümpark'tan ulaşabilirsiniz.

2010-08-15

SQL Server Servislerinin Durumunu Kontrol Etme

SQL Server servislerinizin durumunu  xp_servicecontrol stored procedure'ü ile öğrenebilirsiniz. SQL Server'a ait servislerin çalışma durumuna aşağıdaki şekilde öğrenebilirsiniz:

EXEC xp_servicecontrol N'querystate',N'MSSQLServer'
EXEC xp_servicecontrol N'querystate',N'SQLServerAGENT'
EXEC xp_servicecontrol N'querystate',N'msdtc'
EXEC xp_servicecontrol N'querystate',N'sqlbrowser'
EXEC xp_servicecontrol N'querystate',N'MSSQLServerOLAPService'
EXEC xp_servicecontrol N'querystate',N'ReportServer'

2010-08-09

Pegasus Havayollarının Biletleme Sistemi Transactional Çalışmıyor

Pegasus havayollarının internet sayfasından bilet alamadığım halde kredi kartı provizyonuna bilet tutarı kadar harcama yansıyan mağdurlardan birisi de benim. Biletleme sistemlerindeki ana sorun işlem sonucu ile ödemenin aynı TRANSACTION içerisinde yapılmaması(Burdaki ayrıntılı sorun ise reservasyon timeout süresi gibi bir iş kuralının ödeme onayı alındıktan kontrol edilmesi olarak göze çarpıyor. Halbuki ödeme onayı yapılmadan önce bu iş kuralı da kontrol edilip bu süre timeout olmamışsa ödeme adımına geçilmeli aksi takdirde ödeme alınıp biletleme işlemi yapılamıyor). Biletleme ile ödemeyi yapan transactionlar birbirinden bağımsız ve biri diğerini beklemeden oluştuğu için hatalara açık kapı bırakıyor. Pegasus havayolu firmasının biletleme sisteminde yapması gereken tek şey biletme ile ödeme sisteminin aynı transaction bloğu içerisinde gerçekleştirmesi. Böylelikle bir işlem ya başarılı olup COMMIT olur yada başarısız olup ROLLBACK olur. Benim gibi bileti oluşmadığı halde bilet ücreti kendisinden alan mağdurlar da kapınızı çalıp hem kendisini hem de sizi meşgul etmemiş olur. Ayrıca müşteri memnuniyetsizliğini de yaşatmamış olursunuz. Biletleme ve ödeme sisteminizin bir an önce TRANSACTIONAL yapıya geçmesi dileğiyle...

2010-08-08

İstanbul Sabiha Gökçen Havalimanından Şanlıurfa'ya Uçmanın Vakti Gelmedi mi?

Evet, bilimum ortamlardaki(mail, iletişim sayfaları, sosyal medya,telefon vs.) girişimlerimiz sonucu Pegasus Havayolları 2 Nisan 2012  tarihinden itibaren İstanbul S.Gökçen-Şanlıurfa GAP karşılıklı seferlerini başlatma kararı aldı. Kararın alınmasında emeği geçen herkese ve Pegasus Havayollarına teşekkürler. 


Pegasus Havayollarının konu ile ilgili haberi aşağıdadır:



51. Uçuş Noktamız Şanlıurfa!

2012 yılında da misafirlerine yeni destinasyonlar sunmaya devam eden Pegasus Hava Yolları, Güneydoğu Anadolu’nun tarihi güzelliklerine ev sahipliği yapan Şanlıurfa seferlerine Nisan ayında başlıyor 

Uçuş ağını yurt içinde de  genişletmeye devam eden Pegasus Hava Yolları’nın Nisan ayından itibaren başlayacak Şanlıurfa seferlerinin biletleri 16 Şubat’da, vergiler dahil 59,99 TL’den başlayan fiyatlarla satışa sunuluyor.
Pegasus’un toplamda 51. destinasyonu olan ve 2 Nisan 2012 tarihinde başlayacak Şanlıurfa uçuşları, Pazartesi, Perşembe ve Cumartesi günleri saat 05.35’de ve Salı günleri 20.10’da İstanbul Sabiha Gökçen Havalimanı’ndan gerçekleşecek. Şanlıurfa’dan İstanbul’a uçmak isteyen misafirler için ise Pazartesi, Perşembe ve Cumartesi günleri saat 07.30’da ve Salı günleri 22.05’de seferler düzenlecek.
Pegasus misafirleri, İstanbul’ aktarmalı olarak Şanlıurfa’dan Amsterdam, Basel, Brüksel, Bükreş, Düsseldorf, Kopenhag, Lefkoşa, Londra, Milano, Münih, Paris, Priştine, Roma, St. Etienne, Stokholm, Stuttgart, Üsküp, Viyana ve Zürih’e uçabilecekler.
Tarihi güzelliklerle dolu şehirde geçmişe doğru unutulmayacak bir gezi!
Güneydoğu’nun eşsiz yapısı içerisinde tarihin derinliklerine bir gezi hayal edenler için, Pegasus, 2 Nisan’da başlayan Şanlıurfa seferleri ile uygun fiyatlı bir alternatif sunuyor.
Pegasus, Urfa Kalesi’nin, Balıklı Göl’ün, Harran’nın ve renkli çarşılarının  oluşturduğu etkileyici atmosfer ile tanışmamış olanları veya bu eşsiz toprakların tadına doyamamış gezginleri  16 Şubat 2012’den itibaren vergiler dahil 59,99 TL’den başlayan fiyatlarla bilet almaya davet ediyor.





Sabiha Gökçen Havaalanından Şanlıurfa'ya Pegasus hava yollarının uçmasını istiyorsanız:
Pegasus ile İst.Sabiha Gökçen'den Ş.urfaya direk uçmak isteyenler aşağıdaki adresi tıklayın:
https://book.flypgs.com/Common/QMessageNewEntry.jsp?activateLanguage=TR


Çıkan sayfada zorunlu olan AD,SOYAD ve E-MAIL bilgilerinizi girin.
KONU kısmında PEGASUS u seçin.MESAJ kısmında ise aşağıdaki mesajı yazıp DEVAM butonuna tıklayın:


MESAJ: İstanbul Sabiha Gökçen-Ş.urfa GAP uçuşlarınız ne zaman başlayacak?






Sevgili dostlar,


İstanbul Sabiha Gökçen Havalimanından Şanlıurfa'ya aktarmasız uçmaya nail olan ender kişilerden birisi olarak addediyorum kendimi. Çünkü halihazırda bilimum havayolları(THY, Pegasus, OnurAir, SunExpress, AnadoluJet, BoraJet vs.) şirketlerinin hiçbirisi Sabiha Gökçen Havalimanından Şanlıurfa'ya direk uçmuyor. THY kısıtlı bir zaman diliminde(17 Mayıs-31 Temmuz 2010 tarihleri arasında) göstermelik te olsa Atatürk Havalimanındaki iki seferinden birisini Sabiha Gökçen'e taşıyarak direk uçuşlar gerçekleştirdi. Bu direk uçuşlar çok makbule geçti mateessüf tekrarı gelmedi. Sabiha Gökçen uçuşlarının tekrar Atatürk Havalimanına alınmasını Temmuz ortasında fark ettim ve THY ile iletişime geçtim. THY müşteri hizmetlerinin cevap maili aşağıdaki gibidir:


"Sayın Mehmet GÜZEL,

11 Temmuz 2010 tarihli e-mail mesajınız ünitemize ulaşmıştır.

Mesajınıza konu olan hususa ilişkin olarak, Sabiha Gökçen Havalimanı'ndan Şanlıurfa seferleri Atatürk Havalimanı'ndan yapılacak olup, Atatürk Havalimanı'ndaki pist bakımı çalışmaları nedeniyle bu şekilde planlanmış olduğu ve bakım bittiğinde tekrar Atatürk Havaliman'ndan seferlerin icra edileceği bilgisi ilgili ünitemizden alınmıştır.

Türk Hava Yolları olarak amacımız, hizmetin her kademesinde siz yolcularımıza daima en iyi hizmeti vermektir. Bu amacımıza, bizlere ilettiğiniz yapıcı eleştiri ve olumlu/olumsuz görüşleriniz büyük katkı sağlamaktadır.

Bilgilerinizi rica eder, saygılar sunarız.

TÜRK HAVA YOLLARI A.O.
MÜŞTERİ İLİŞKİLERİ MÜDÜRLÜĞÜ"



Bu işin arkasını bırakmayarak hava yolu firmalarından Pegasus, OnurAir, SunExpress, AnadoluJet müşteri hizmetleri kanalıyla Sabiha Gökçen-Şanlıurfa direk uçuşlarının ne zaman başlatacaklarını sordum. Cevabi maillerde mealen bu yıl içerisinde böyle bir planları olmamakla birlikte filolarındaki uçak sayısının artması ile birlikte teklifimi düşüneceklerini ilettiler.


Bakalım Sabiha Gökçen-Şanlıurfa direk uçuşlarını kim ne zaman başlatacak? Tabi ben havayolu firması kurmak zorunda kalıp direk uçuşları başlatmadan önce birileri bunu gerçekleştirirse iyi olacak:)


Direk uçuşların olmamasını ihtiyaç sahiplerinin sesini çıkarmamasına ve gerekli girişimlerde bulunmamasına bağlıyorum. Bu konuda bir tek benim sesim ve nefesim bile kalsa direk uçuşların yapılmasını sağlayacağım i.allah. 1.5 milyon nüfusuyla, kültür ve inanç turizmiyle, önemli ticaret hacmiyle, GAP'ın merkezi olması hasebiyle Sabiha Gökçen'den direk uçuşun olmamasını yurtiçi havayolu taşımacılığı yapan tüm firmaların eksikliği olarak görüyorum. Bakalım bu eksikliklerini ne zaman giderecekler?


Havayolu ile Gaziantep yada Diyarbakır üzerinden Şanlıurfa'ya gitmek zorunda kalan herkesi bu konuya destek olmaya davet ediyorum.


Ek: Konu ile ilgili diğer hava yolu firmalarının cevapları:


"Sayin Mehmet GUZEL,

gondermis oldugunuz e-posta icin tesekkur ederiz. Ilgili guzergah icin henuz spesifik bir tarih belirlenmemistir. Belirlendigi takdirde kamuoyu ile paylasilacaktir.


Saygilarimizla,

SunExpress

Musteri Iliskileri"
   
 
"Sayın MEHMET GÜZEL,


Uçuş ağımızın genişletilmesi çalışmaları devam etmektedir . Potansiyel bulunan tüm noktalar dikkate alınmaktadır . İlginize teşekkür ederiz.


Saygılarımızla ,


Pegasus Havayolları Misafir İlişkileri"
   
 
"Sayın YOLCUMUZ,


22.07.2010 tarihli mesajınız ünitemize intikal etmiştir.


Tarife planlama biriminden alınan bilgilerden, yaz tarifemizi icra eden sınırlı sayıdaki uçağımızdan dolayı Sabiha Gökçen - Şanlıurfa karşılıklı seferleri yaz dönemi için mümkün değildir.Fakat kış tarifesinde talebiniz değerlendirmeye alınacaktır.


Bilgilerinizi rica eder, saygılar sunarız.


ANADOLUJET
MÜŞTERİ İLİŞKİLERİ"




"Sayin Mehmet GUZEL,

gondermis oldugunuz e-posta icin tesekkur ederiz.
Ic hat ucuslarinda hizla buyumeyi hedefleyen, bu dogrultuda atilimlar yapan sirketimiz ulkemizin potansiyellerinden haberdar olmakta ve uygun goruldugu takdirde yeni guzergalarda ucuslar gerceklestirmektedir.

Yolcularimizdan gelen taleplerin yogunlugu da bu surecte etkili olmakta ve ayrica degerlendirilmektedir.

Bu noktada talebinizi bizim ile paylastiginiz icin tesekkur ederiz.

Yeni ucuslarimizda gorusmek dilegimizle,

Saygilarimizla,

SunExpress

Musteri Iliskileri"

2010-08-07

Yararlı DBCC Komutları - Clear SQL Cache

-- SQL deki procedure cache'lerini silme
DBCC FREEPROCCACHE;

-- Cache'den özel bir sql plan silme
DBCC FREEPROCCACHE (0x060006001ECA270EC0215D05000000000000000000000000);
/*
Bir sql plan bozulduğunda ve başınızı ağrıttığında tüm cache silmeden ilgili bozuk cache silmek oldukça işinize yarayacaktır. Saniyede 1000 transaction alan bir sql planınızın bozulduğunu düşünün. Veritabanı sisteminiz alt üst olmadan ve tüm cache sıfırlamadan terayağından kıl çeker gibi işi zahmetsizce yapabileceğiniz yararlı bir dbcc komutu.
*/

-- Ad-hoc SQL planlarını silme
DBCC FREESYSTEMCACHE('SQL Plans');

2010-08-03

Tüm Kullanıcı Veritabanlarının Full Backup'ını Alma

/*
Tüm kullanıcı veritabanlarınızın full ve compress backup'ını tek seferde aşağıdaki T-SQL kodu ile alabilirsiniz.
*/

use master
go
declare @db_name nvarchar(128),
@stmt varchar(8000)

declare crdatabase insensitive cursor for
select name from sys.databases
where database_id>4

open crdatabase fetch from crdatabase into @db_name
while (@@fetch_status =0)
begin
set @stmt= 'BACKUP DATABASE ['+ @db_name +'] TO DISK = N''D:\' + @db_name + '.bak'' WITH NOFORMAT, INIT, NAME = N''Full Database Backup'', SKIP, NOREWIND, NOUNLOAD,COMPRESSION, STATS = 10'
exec(@stmt)

fetch next from crdatabase into @db_name
end
close crdatabase
deallocate crdatabase

--Not: Kodlar SQL Server 2008 ile test edilmiştir.

2010-07-31

Last Update Index Statistics

Son 30 gündür istatistiği güncellenmeyen indexlerin istatistiğini güncelleyecek SQL kodu aşağıdaki gibidir:

select 'update statistics [' + object_schema_name(s.object_id) + '].[' + object_name(s.object_id) + '] '+ s.name
+ ' with fullscan --Rows:' + cast(p.rows as varchar) + ' Last Update:'+ convert(varchar(16),stats_date(s.object_id, s.stats_id) ,112)+ '
go'
from sys.stats s inner join sys.partitions p on s.object_id=p.object_id and s.stats_id=p.index_id
where stats_date(s.object_id, s.stats_id) < getdate()-30 and s.name not like '_WA%' and object_schema_name(s.object_id)<>'sys'
and p.rows>1000000
and p.partition_number=1
order by p.rows

Açıklama satırı olarak eklenen kayıt sayısı ve index istatistiğinin en son güncellendiği tarih bilgi vermek açısından yararlı olacaktır.

2010-07-28

Cross-Database Dependencies

select db_name() as current_db_name,
object_name(referencing_id) as object_name ,
upper(coalesce(sed.referenced_server_name, '')) as referenced_server_name,
sed.referenced_database_name,
sed.referenced_schema_name,
sed.referenced_entity_name
from sys.sql_expression_dependencies as sed
where referenced_database_name <> db_name()
and referenced_database_name <> 'msdb'
order by upper(referenced_server_name)

2010-04-15

Gizli Sonsuz Döngü

Diyelim ki parametre olarak verilen bir string’i 16 karaktere tamamlama ihtiyacımız var ve aşağıdaki gibi sp’mizi yazdık:

create proc FixedLength
@InputStr varchar(16)
as
begin
set nocount on
while len(@InputStr) < 16
begin
set @InputStr = @InputStr + ' '
end
select @InputStr
end
go

Gayet basit bir şekilde, @InputStr’nin uzunluğu 16 karakterden küçük olduğu sürece @InputStr değişkeninin sonuna boşluk karakteri ekleniyor. Gayet masumane gibi gözükse de sp’mizi aşağıdaki gibi çalıştırdığımızda sonsuz bir döngünün fitilini ateşlemiş oluruz:

exec FixedLength '123456';

LEN fonksiyonu; karakter kümesinin sağındaki boşlukları kale almaz, yani bir nevi RTRIM yapar. len(@InputStr) değeri sürekli 6 olarak döndüğü için sonsuz döngüye girer. Sorunun çözümü için hemen datalength fonksiyonunu kullanalım diyenleri duyar gibiyim Evet, datalength fonksiyonu bu sp’miz için çözüm olur fakat @InputStr varchar(16) yerine nvarchar(16) olsaydı sp sonsuz döngüye girmezdi ama istediğimiz sonucu da alamazdık.(@InputStr='123456 ' olduğunda datalength(@InputStr) değeri 16 olur ve döngüden çıkar fakat elde etmek istediğimiz '123456 ' sonucunu alamamış olurduk). Bir değişken nvarchar olduğunda her karakter için 2 byte yer kaplar. Datalength fonksiyonu nvarchar olarak tanımlanan bir değişkenin karakter uzunluğunu karakter sayısının 2 katı olarak verir.

Not: While döngüsü kullanmadan daha kısa kod ile işimizi halledebiliriz diyenler için aşağıdaki kısa kod işimizi görür ama sonsuz döngü örneğimiz için işimize yaramaz:)

create proc FixedLength
@InputStr varchar(16)
as
begin
set nocount on
set @InputStr=@InputStr + replicate(' ',16-len(@InputStr))
select @InputStr
end
go

2010-04-12

Delete Duplicate Rows

;WITH CTE (Field1,Field2,DuplicateCount)
AS
(
SELECT Field1,Field2,
ROW_NUMBER() OVER(PARTITION BY Field1,Field2 ORDER BY Field1) AS DuplicateCount
FROM TableName
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO

--Not: SQL Server 2005/2008 versiyonlarında test edilmiştir.

2010-02-23

SQL Server 2005/2008 Servis Pack Planları

SQL Server 2008 SP2 2010 yılının 3. çeyreğinde çıkmış olacak; SQL Server 2005 SP4 ise 2010 yılının 4. çeyreğinde kullanılabilir olacak. SQL Server 2005 için SP4 son servis pack olacak. Microsoft SQL Server 2005'e desteğini 13 Nisan 2011'de kesecek; uzatılmış desteğini ise 12 Nisan 2016'ya kadar sürecek.

2010-02-01

SQL Server 2008 R2 Geliyor

Değerli okuyucu,

Microsoft, 2010 yılının Mayıs ayı içerisinde SQL Server 2008 R2 sürümünü çıkaracağını duyurdu. R2 sürümü dört gözle bekleyenlere duyurulur.

2010-01-07

Clustered Primary Key'i Nonclusted Yapma

Merhaba değerli okuyucu,

Geçenlerde clustered primary key contraint'ini nonclustured yapıya dönüştürme ihtiyacım oldu. İhtiyacımın temel sebebi de yanlış oluşturulan clustred bir primary key index'ini nonclustered yapıp farklı bir indexi clustered index'e çevirmek istememdi.

Bu işlemleri online bir sistemde gerçekleştirdiğimden daha titiz olmam gerekiyordu. Bu yüzden aşağıdaki adımları izledim:
  1. Primary key'ler unique olduğundan key yapısını bozmamak için temporary unique bir index oluşturdum,
  2. Tablo üstündeki Primary Key'i drop ettim
  3. Tabloya Primary Key constraint'ini ekledim
  4. İlk oluşturduğum temporary unique index e artık ihtiyacım kalmadığı için drop ettim.
Yukardaki ifadeler için gerekli olan sql kodları aşağıdaki gibidir:

--temp unique indexi online oluşturma
create unique nonclustered index tmpindex on tablo
(id) with (online=on) on primary
go

--online olarak primary key i drop etme
alter table tablo drop constraint pk_tablo with (online=on)
go

--nonclustered primary key i online olarak oluşturma
alter table tablo add constraint pk_tablo
primary key nonclustered (id) with (online=on) on primary
go

--temp index i drop etme
drop index tablo.tmpindex
go

2009-12-09

text, ntext ve image veri tipleri

Microsoft, SQL Server'ın yeni çıkacak sürümlerinde text, ntext ve image veri tiplerini kaldıracağını bildiriyor. Bu veri tiplerinin yerine varchar(max), nvarchar(max) ve varbinary(max) veri tiplerini kullanabilirsiniz.

2009-09-03

SQL Server 2005/2008 Registered Server Listesi

SQL Server 2005/2008 de registered server isimlerini aşağıdaki path ve dosyalarda tutuluyor:

SQL Server 2005:
C:\Documents and Settings\\Application Data\Microsoft\Microsoft SQL Server\90\Tools\Shell\RegSrvr.xml

SQL Server 2008:
C:\Documents and Settings\\Application Data\Microsoft\Microsoft SQL Server\100\Tools\Shell\RegSrvr.xml

Bu listeler özellikle benim gibi SQL Server'ınızı tekrardan kurmak zorunda kalmışsanız çok işinize yarayacaktır.

2009-08-30

SQL Server Sistem Collation'ını Değiştirme

Komut satırından aşağıdaki komut yardımıyla SQL Server'ınızın sistem collation'ını değiştirebilirsiniz:

Setup /QUIET /ACTION=REBUILDDATABASE /INSTANCENAME=MSSQLSERVER /SQLSYSADMINACCOUNTS=sa / SAPWD=Passw0rd /SQLCOLLATION=DegistirilecekCollation

Not: master system veritabanı değiştiği için tüm login, yetkiler vs bilgiler uçar(benden uyarması:))!

2009-08-25

SQL Server ile Bilgisayar Adını Bulma

SQL Server üzerinden xp_getnetname sp'ü ile server ismini alabilirsiniz. Bu sp yararlı bir undocumented extended sp olup; aşağıdaki gibi kullanabilirsiniz:

EXEC master.dbo.xp_getnetname

2009-08-19

Disklerdeki Boş Yer Büyüklüğünü Bulma

Server'ınıza bağlı disklerdeki boş yeri SQL Server üzerinden aşağıdaki sp ile bulabilirsiniz:

EXEC master.dbo.xp_fixeddrives

2009-08-16

Undocumented System Views

SQL Server 2005'te dökümante edilmemis sistem view'ları aşağıdaki gibidir:

Base Table Description
sys.sysschobjs : Exists in every database. Each row represents an object in the database.
sys.sysbinobjs : Exists in every database. Contains a row for each Service Broker entity in the database. Service Broker entities include the following:
Message type Service contract
Service The names and types use binary collation that is fixed.

sys.sysclsobjs : Exists in every database. Contains a row for each classified entity that shares the same common properties that include the following:
Assembly
Backup device
Full-text catalog
Partition function
Partition scheme
File group
Obfuscation key

sys.sysnsobjs : Exists in every database. Contains a row for each namespace-scoped entity. This table is used for storing XML collection entities.
sys.syscolpars : Exists in every database. Contains a row for every column in a table, view, or table-valued function. It also contains rows for every parameter of a procedure or function.
sys.systypedsubobjs : Exists in every database. Contains a row for each typed subentity. Currently, only parameters for partition function fall into this category.
sys.sysidxstats : Exists in every database. Contains a row for each index or statistics for tables and indexed views
Note:
Every index (except heap) is associated with a statistic that has the same name as the index.
sys.sysiscols : Exists in every database. Contains a row for each persisted index and statistics column.
sys.sysscalartypes : Exists in every database. Contains a row for each user-defined or system type.
sys.sysdbreg : Exists in the master database only. Contains a row for each registered database.
sys.sysxsrvs : Exists in the master database only. Contains a row for each local, linked, or remote server.
sys.sysrmtlgns : This system base table exists in the master database only. Contains a row for each remote login mapping. This is used to map incoming logins that claim to be coming from a corresponding server to an actual local login.
sys.syslnklgns : Exists in the master database only. Contains a row for each linked login mapping. Linked login mappings are used by remote procedure calls and distributed queries that emanate from a local server out to a corresponding linked server.
sys.sysxlgns : Exists in the master database only. Contains a row for each server principal.
sys.sysdbfiles : Exists in every database. If the column dbid is zero, the row represents a file that belongs to this database. In the master database, the column dbid can be nonzero. When this is the case, the row represents a master file.
sys.sysusermsg : Exists in the master database only. Each row represents a user-defined error message.
sys.sysprivs : Exists in every database. Contains a row for each database- or server-level permission.
Note: Server-level permissions are stored in the master database.
sys.sysowners : Exists in every database. Each row represents a database principal.
sys.sysobjkeycrypts : Exists in every database. Contains a row for each symmetric key, encryption, or cryptographic property associated with an object.
sys.syscerts : Exists in every database. Contains a row for each certificate in a database.
sys.sysasymkeys : Exists in every database. Each row represents an asymmetric key.
sys.ftinds : Exists in every database. Contains a row for each full-text index in the database.
sys.sysxprops : Exists in every database. Contains a row for each extended property.
sys.sysallocunits : Exists in every database. Contains a row for each storage allocation unit.
sys.sysrowsets : Exists in every database. Contains a row for each partition rowset for an index or a heap.
sys.sysrowsetcolumns : Exists in every database. Contains a row for each column, of partition rowset.
sys.syshobts : Exists in every database. Contains a row for each heap or B-tree (HOBT) that can host multiple rowsets
sys.syshobtcolumns : Exists in every database. Contains a row for each column of a HOBT.
sys.sysserefs : Exists in every database. Contains a row for each general storage engine metadata reference.
sys.sysrowsetrefs : Exists in every database. Contains a row for each index to rowset reference.
sys.syslogshippers : Exists in the master database only. Contains a row for each database mirroring witness.
sys.sysremsvcbinds : Exists in every database. Contains a row for each remote service binding.
sys.sysconvgroup : Exists in every database. Contains a row for each service instance in Service Broker.
sys.sysxmitqueue : Exists in every database. Contains a row for each Service Broker transmission queue.
sys.sysdesend : Exists in every database. Contains a row for each sending endpoint of a Service Broker conversation.
sys.sysdercv : Exists in every database. Contains a row for each receiving endpoint of a Service Broker conversation.
sys.sysendpts : Exists in the master database only. Contains a row for each endpoint created in the server.
sys.syswebmethods : Exists in the master database only. Contains a row for each SOAP-method defined on a SOAP-enabled HTTP endpoint that is created in the server.
sys.sysqnames : Exists in every database. Contains a row for each namespace or qualified name to a 4-byte ID token.
sys.sysxmlcomponent : Exists in every database. Each row represents an XML schema component.
sys.sysxmlfacet : Exists in every database. Contains a row for each XML facet (restriction) of XML type definition.
sys.sysxmlplacement : Exists in every database. Contains a row for each XML placement for XML components.
sys.syssingleobjrefs : Exists in every database. Contains a row for each general N-to-1 reference.
sys.sysmultiobjrefs : Exists in every database. Contains a row for each general N-to-N reference.
sys.sysobjvalues : Exists in every database. Contains a row for each general value property of an entity.
sys.sysguidrefs : Exists in every database. Contains a row for each GUID classified ID reference.

2009-08-15

En Son Alınan Backuplar(Last Backups)

SQL Server veritabanlarının en son alınan backupların başlangıç ve bitiş tarih ve saatlerini aşağıdaki SQL kodu ile alabilirsiniz:

SELECT user_name ,
database_name ,
server_name ,
backup_start_date ,
backup_finish_date ,
Type
FROM msdb.dbo.backupset
WHERE backup_set_id IN(SELECT MAX(backup_set_id) FROM msdb.dbo.backupset
WHERE TYPE in ('D','I')
GROUP BY database_name)
AND database_name IN(SELECT name FROM master.dbo.sysdatabases)
ORDER BY database_name

2009-08-05

Regaib Kandiliniz Mübarek Olsun

Regaib kandilinizi tebrik eder; kandilin hayırlara vesile olmasını Cenab-ı Hak'tan niyaz ediyorum.

2009-08-03

DBCC SHOWCONTIG

Tablo ve viewlarda bulunan veri ve indexlere ait fragmantasyonları aşağıdaki kod ile görebilirsiniz:

dbcc showcontig('TabloAdi') with ALL_INDEXES,TABLERESULTS , FAST

2009-07-27

T-SQL Best Practices

  1. select cümlelerinizde muhakkak field isimlerini açık bir şekilde yazın; select * kullanmaktan kaçının
  2. Mecbur kalmadıkça UNION kullanmayın. UNION yerine UNION ALL kullanmak daha performanslıdır.
  3. Yine mecbur kalmadıkça DISTINCT i kullanmayın. Çünkü DISTINCT ın yaptığı sıralama ve çift kayıtları tek e indirmektir.
  4. sp içerisinde tek bir kayıt döndürecekseniz bu kaydı select ile döndürmek yerine OUTPUT parametresi olarak verin.
  5. Zorunlu olmadıkça ORDER BY ifasesinden kaçının

2009-07-23

Login Failedleri Alma

/*
Son bir günde alınan login failed leri aşağıdaki SQL kodları ile alabilirsiniz.
*/

CREATE TABLE #tmploginfailed (
LogDate smallDATETIME,
ProcessInfo NVARCHAR(50),
[Text] NVARCHAR(MAX))
go


insert into #tmploginfailed
EXEC xp_readerrorlog 0,1,'login failed','login failed'

go

select cast(cast(LogDate as varchar(12)) as smalldatetime) as Date ,Text,count(1) as AttemptCount
from #tmploginfailed
where LogDate>=getdate()-1
group by cast(cast(LogDate as varchar(12)) as smalldatetime),text
order by count(1) desc,cast(cast(LogDate as varchar(12)) as smalldatetime)
go

drop table #tmploginfailed
go

2009-04-11

Blog Ödülleri 2009'a Katıldım

Günlüğüm Blog Ödülleri 2009'da Teknoloji kategorisinde yarışmaya katılıyor. Dilediğiniz kategorilerde iyi olduğuna inandığınız günlüklere 11-26 Nisan tarihleri arasında oy verip destek olabilirsiniz.

Tüm günlüklere başarılar diliyorum.

2009-04-08

SQL Server 2008 SP1 Yayında

SQL Server 2008'in beklenen Service Pack 1'i nihayet yayında. SQL Server 2008 SP1'i microsoft'tan indirebilirsiniz(Build 10.00.2531.00).

2009-03-23

Kullanıcı Tablolarında Bulunan İndexlerin Filegrouplarını Bulma

Primary filegroup üzerinde bulunan indexleri aşağıdaki kod ile bulabiliriz:

SELECT o.[name], o.[type], i.[name], i.[index_id], f.[name]
FROM sys.indexes i (nolock) INNER JOIN sys.filegroups f (nolock) ON i.data_space_id = f.data_space_id
INNER JOIN sys.all_objects o (nolock) ON i.[object_id] = o.[object_id]
WHEREo.type<>'s' and o.type='U' and f.name='PRIMARY'
ORDER BY o.name, i.name


Bu kod özellikle nesnelerinizi filegroup'lar arasında taşırken; özellikle "Hangi indexleri taşımadım?" sorusuna cevap niteliğinde.

2009-03-22

Bir Tabloya Ait İndekslerin İstatistiklerini Bulma

SELECT
object_name(sys.indexes.Object_id) AS Table_Name,
ISNULL(sys.indexes.name, '---') AS index_name,
partitions.Rows,
partitions.SizeMB,
sys.indexes.type_desc,
sys.indexes.is_unique,
sys.indexes.is_primary_key,
sys.indexes.is_unique_constraint,
sys.indexes.is_unique,
ISNULL(Index_Columns.index_columns_key, '---') AS index_columns_key,
ISNULL(Index_Columns.index_columns_include, '---') AS index_columns_include,
ISNULL(sys.dm_db_index_usage_stats.user_seeks,0) AS user_seeks,
ISNULL(sys.dm_db_index_usage_stats.system_seeks,0) AS system_seeks,
ISNULL(sys.dm_db_index_usage_stats.user_scans,0) AS user_scans,
ISNULL(sys.dm_db_index_usage_stats.system_scans,0) AS system_scans,
ISNULL(sys.dm_db_index_usage_stats.user_lookups,0) AS user_lookups,
ISNULL(sys.dm_db_index_usage_stats.system_lookups,0) AS system_lookups,
ISNULL(sys.dm_db_index_usage_stats.user_updates,0) AS user_updates,
ISNULL(sys.dm_db_index_usage_stats.system_updates,0) AS system_updates,
(
(
(CONVERT(Numeric(19,6), ISNULL(sys.dm_db_index_usage_stats.user_seeks,0))+CONVERT(Numeric(19,6), ISNULL(sys.dm_db_index_usage_stats.system_seeks,0)))*10
+ CASE WHEN sys.indexes.type=2 THEN (CONVERT(Numeric(19,6), ISNULL(sys.dm_db_index_usage_stats.user_scans,0))+CONVERT(Numeric(19,6), ISNULL(sys.dm_db_index_usage_stats.system_scans,0)))*1 ELSE 0 END
+ 1
)
/CASE WHEN sys.indexes.type=2 THEN (CONVERT(Numeric(19,6), ISNULL(sys.dm_db_index_usage_stats.user_updates,0))+CONVERT(Numeric(19,6), ISNULL(sys.dm_db_index_usage_stats.system_updates,0))+1) ELSE 1 END
) AS Score
FROM
sys.indexes
JOIN (
SELECT
object_id, index_id, SUM(row_count) AS Rows,
CONVERT(numeric(19,3), CONVERT(numeric(19,3), SUM(in_row_reserved_page_count+lob_reserved_page_count+row_overflow_reserved_page_count))/CONVERT(numeric(19,3), 128)) AS SizeMB
FROM sys.dm_db_partition_stats
GROUP BY object_id, index_id
) AS partitions ON sys.indexes.object_id=partitions.object_id AND sys.indexes.index_id=partitions.index_id
CROSS APPLY (
SELECT
LEFT(index_columns_key, LEN(index_columns_key)-1) AS index_columns_key,
LEFT(index_columns_include, LEN(index_columns_include)-1) AS index_columns_include
FROM
(
SELECT
(
SELECT sys.columns.name + ', '
FROM
sys.index_columns
JOIN sys.columns ON
sys.index_columns.column_id=sys.columns.column_id
AND sys.index_columns.object_id=sys.columns.object_id
WHERE
sys.index_columns.is_included_column=0
AND sys.indexes.object_id=sys.index_columns.object_id AND sys.indexes.index_id=sys.index_columns.index_id
ORDER BY key_ordinal
FOR XML PATH('')
) AS index_columns_key,
(
SELECT sys.columns.name + ', '
FROM
sys.index_columns
JOIN sys.columns ON
sys.index_columns.column_id=sys.columns.column_id
AND sys.index_columns.object_id=sys.columns.object_id
WHERE
sys.index_columns.is_included_column=1
AND sys.indexes.object_id=sys.index_columns.object_id AND sys.indexes.index_id=sys.index_columns.index_id
ORDER BY index_column_id
FOR XML PATH('')
) AS index_columns_include
) AS Index_Columns
) AS Index_Columns
LEFT OUTER JOIN sys.dm_db_index_usage_stats ON
sys.indexes.index_id=sys.dm_db_index_usage_stats.index_id AND sys.indexes.object_id=sys.dm_db_index_usage_stats.object_id
AND sys.dm_db_index_usage_stats.database_id=DB_ID()
WHERE
sys.indexes.object_id=object_id('TableName')

2009-03-18

Bir Veritabanının Büyümesini İzleme

Bir veritabanının büyümesini hızlı olarak aşağıdaki kod ile alabilirsiniz:

select
backup_start_date BackupDate
, floor(backup_size/1024000000) SizeGB
from msdb..backupset
where database_name = db_name()
and type = 'd'
order by backup_start_date desc

2009-03-17

Askerlikten Damlalar

Siyaha boyanmış bir pencereden
Seyretmek zor dünyayı...
Hayatın henüz baharında
Solmaya başlamış gülü yeşertmek zor.

Ekip ruhundan yoksun insanlardan uzak dur!
Vakit doldu, yeni bir gün bitti; son budur...

Akdağ/Karaburun, İzmir
17.06.2002 16:53 (Mesai çıkışı)

2009-03-11

Extended Property Nasıl Eklenir?

Bir tablo yada tablonun bir field'ına extended property nasıl eklenir? sorusuyla sık sık karşılaştığım için ekleme ihtiyacı hissettim.

--Tablonun extended property'sini ekleme
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Tablo Aciklamasi’, @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TabloAdi'
GO

--Field extended property'i ekleme
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'İlgili fieldin Aciklamasi’, @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'TabloAdi', @level2type=N'COLUMN',@level2name=N'FieldAdi'
GO

2009-02-19

Veritabanındaki EXECUTE Yetkisinin Otomatik Oluşturulması

Değerli Okuyucular,

Geçenlerde iki farklı ortamda aynı veritabanının EXECUTE yetkilerinin aynı olmadığı iletilince gerçek ortamdaki EXECUTE yetkilerini bulup diğer ortama uygulamam gerekti. Bunun için EXECUTE yetkilerini otomatik oluşturan aşağıdaki SQL kodunu yazdım. Umarım sizin de işinize yarar.

select PE.state_desc + ' ' + PE.permission_name + ' ON ' + object_schema_name (Pe.major_id) + '.' + object_name(PE.major_id) + ' TO ' + CAST(PR.Name COLLATE Latin1_General_CI_AS as nvarchar(255))
from sys.database_permissions PE INNER JOIN sys.database_principals PR ON PE.grantee_principal_id=PR.principal_id

where PE.type='EX' and PE.major_id>0

2009-02-12

SSIS'te Fuzzy Group Sorunu

Değerli Okuyucular,

Üzerinde SQL Server 2008'ın Standart Edition'ın kurulu olduğu bir sunucum vardı ve üzerinde SSIS paketlerini barındırıp istediğim yerden bu paketlere erişip çalıştırmak istiyordum. Paketi düzgünce SSIS üzerine deploy ettim. Başka sunucumdan bu paketi değişik konfigürasyonlarda denedim. Paketim düzgün çalışmadı ve sürekli hata aldım. Hata package load edememe ile ilgiliydi. Paketi Visual Studio üzerinden düzgün çalıştırabiliyordum. Demek ki server tarafında bir sorun vardı. Paketin içerisinde Fuzzy Group'ta yapılıyordu. Meğer Standart Edition Fuzzy Group'u desteklemiyormuş. Fuzzy Group için Enterprise Edition veya üstü bir sürümü istiyor. Standart Edition'ı Enterprise Edition'a Upgrade ettim sorunum çözüldü.

Bu arada Visual Studio 2005 ile hazırlanan SSIS paketlerin sadece SQL Server 2005 ile; Visual Studio 2008 ile hazırlanan paketlerin sadece SQL Server 2008 ile çalışabildiğini; benzer hatalar ile karşılaşan yada karşılaşacak değerli okuyucularıma hatırlatırım.

2009-02-02

Sysadmin Rolündeki Kullanıcıları Bulma

sysadmin rolündeki kullanıcıları aşağıdaki üç farklı sorgu ile bulabilirsiniz:

  1. SQL Server 2005  ve sonrası için:

    select name
    from sys.syslogins

    where sysadmin=1
    SQL Server 2000 için:

     select name
    from syslogins
    where sysadmin=1
  2. SQL Server 2005 ve sonrası için

    SELECT p.name AS [Name]
    FROM sys.server_principals r INNER JOIN sys.server_role_members m ON r.principal_id = m.role_principal_id
    INNER JOIN sys.server_principals p ON p.principal_id = m.member_principal_id
    WHERE ( r.type ='R' ) and (r.principal_id =3) 
  3.  EXEC sys.sp_helpsrvrolemember 'sysadmin'; -- SQL Server 2005 ve sonrasında çalışır

2009-01-14

2008 Yılı Günlük İstatistikleri

2008 yılında 36.671 tekil kişi günlüğümü ziyaret etti. Bu ziyaretçilerin 34.000'i yurt içinden 2.671'i ise yurt dışından(başta ABD, Almanya, Fransa, İngilitere ve diğer ülkelerden) ulaştı. Toplam 61.872 sayfa görüntülendi. Ziyaretçilerin %78,56'sı Internet Explorer, %19,31'i Firefox üzerinden ulaştı.

Günlüğüme 2008 yılında aşağıdaki adreslerden ulaşıldı:
SıraErişim KaynağıZiyaretYüzde
1.www.google.com/31.27575,92
2.www.mehmetguzel.net/ (direk)7.670 18,62
3.www.ceturk.com/6081,48
4.www.blogger.com/3280,80
5.whos.amung.us214 0,52
6.aydinunlu.blogspot.com700,17
7.2008.blogodulleri.com 680,17
8.www.memikyanik.com/630,15
9.www.search.com/57 0,14
10.www.facebook.com/510,12
11.www.5nk.org/500,12

İlk sırayı geçen sene olduğu gibi büyük bir farkla yine google çekiyor. Google'da bazı anahtar kelimelerle yapılan aramalarda günlüğümün ilk sıralarda gelmesi google'ın günlüğümü kayırması olsa gerek:)

Günlüğüme ziyaretçi gönderen tüm erişim kaynaklarına teşekkürlerimi iletiyorum.

.::YASAL UYARI::.

©2004-2024 Mehmet GÜZEL, www.mehmetguzel.net

Site içeriği kaynak gösterilmek koşuluyla yayınlanabilir. Yazılan yazı ve yorumlar sadece yazı ve yorum sahiplerini bağlar.