Geçici Tablo ve Tablo Türü Değişken Arasındaki Fark

Çalışma esnasında bir kayıt listesinin sonucunu geçici saklamak için geçici tablo (temporary table) veya tablo türü değişken (table variable) kullanırız. Peki bunların arasındaki fark nedir ?
SQL Server’de yerel (local) ve genel (global) olmak üzere 2 tür geçici tablo kullanırız. Yerel tabloları başında “#” olacak şekilde isimlendiririz. Genel tabloları başında “##” olacak şekilde isimlendiririz.

--Yerel geçici tablo
SELECT * INTO #t1 FROM Alisveris

--Genel geçici tablo
SELECT * INTO ##t1 FROM Alisveris

Yerel geçici tablo ile genel geçici tablo arasındaki tek fark, yerel tabloya sadece oluşturulduğu oturumdan erişilebilir. Genel tabloya ise diğer oturumlardan da erişilebilir. Geçici tabloların yaşam süresi oturumlarıyla sınırlıdır. Yani oluşturuldukları oturumda DROP edildikleri zaman veya oturum kapatıldığı zaman tablolar silinmiş olur.
Geçici tablolar üzerinde normal tablolarda yaptığımız her türlü (clustered / non-clustered index oluşturma, identity kolon kullanmaz, transaction yönetimi .) DDL ve DML işlemi yapılabilir. Sadece Foreign Key constraint oluşturulamaz. Geçici tablolar normal tablolar gibi diskte (tempdb) tutulur ve transaction log tarafında loglanır.
Tablo türü değişkenler de geçici tablolar gibi aynı amaç için kullanılır. SQL Server’de değişken tanımlanır gibi tanımlanır. Bu tablolar üzerinde sadece cluster index oluşturulabilir.

--Tablo oluştur
DECLARE @Alisveris TABLE (SatirId INT identity(1,1) primary key,
	UrunAdi VARCHAR(50) )

--Kayıt girelim
INSERT @Alisveris VALUES('Urun1')
INSERT @Alisveris VALUES('Urun2')

--Tabloyu okuyalım
SELECT * FROM @Alisveris

Temporary tables ve table variable arasındaki benzer ve farklılıklar şunlardır;

  1. Her ikisi de TEMPDB içerisinde oluşturulur.
  2. Table variable constraint tarafında daha kısıtlı yeteneğe sahip. Primary Key oluşturulabilse de default ve check constraint konusunda başarılı sayılmaz.
  3. Her ikisi üzerinde cluster index oluşturulabilir.
  4. Table variable üzerinde non-cluster index oluşturulamaz.
  5. Table variable için statistic bilgiler oluşturulmaz.
  6. Ve en önemli fark temporary table, transaction yönetimini desteklerken table variable desteklemez.

SQL Server CPU ve Memory Bilgisi

Üzerinde çalıştığım veri ambarı projesi için gerekmişti. SQL üzerinden makinein sahip olduğu işlemci ve bellek bilgisini almak istedim. Bunun için aşağıdaki script kullanılabilir.

-- CPU bilgisini Registry'den alacağız
EXEC xp_instance_regread
'HKEY_LOCAL_MACHINE',
'HARDWARE\DESCRIPTION\System\CentralProcessor\0',
'ProcessorNameString';

-- CPU ve Memory bilgisi
SELECT cpu_count AS [CPU sayısı (mantıksal)]
,hyperthread_ratio
,cpu_count/hyperthread_ratio AS [CPU sayısı (fiziksel)]
,physical_memory_in_bytes/1048576/1024 AS [Toplam bellek miktarı (GB)]
FROM sys.dm_os_sys_info;

SQL Server Dedicated Administrator Connection (DAC)

SQL Server 2005 ile birlikte DAC (Dedicated Administrator Connection), SQL Server’in yoğunluktan, kilitlenmenin oluşmasından hiçbir bağlantıya yanıt vermediği bir anda sistem yöneticisinin sisteme giriş yapabilmesini sağlayan önemli bir özelliktir. Bu tür durumlarda SQL Server’i restart etmek sorun yaratabileceği için sisteme bağlanıp olup biteni görmekte fayda var. Bunun için öncelikle sunucunu DAC özelliğinin aktif olması gerekir. Bu özelliği yere veya uzaktan erişim için ayarlayabiliriz.

Use master
GO
--0 = Yerel Bağlantı İzni,
--1 = Uzak Bağlantı İzni
sp_configure 'remote admin connections', 0
GO
RECONFIGURE
GO

SQL Server 2005’te “Surface Area Configuration” aracında da aynı ayara erişilebilir.
Bu özelliği aktifleştirdikten sonra SQL Server’e hem komut satırından (SQLCMD) hem de Management Studio üzerinden erişiebiliriz.
Okumaya devam et

SQL Server Instance Hangi Portu Kullanıyor

Birden fazla SQL Server instance kurduğumuz makinede hangi instance hangi portu kullanıyor bazen bunu bulmakta zorlanabiliyoruz. Uzaktan makineye erişemiyor olmamızın nedeni çoğu zaman doğru portu bilmiyor olmamızdır. SQL Server’in hangi portu kullandığını birkaç şekilde öğrenebiliriz.
Okumaya devam et

SQL Server Management Studio Özelleştirme ve Hızlandırma

SQL Server Management Studio (SSMS) hiç şüphesiz SQL Server sistemlerini yönetmek ve üzerinde uygulama geliştirmek için en güçlü araçtır. Hali hazırda çalışan bir uygulama için belli anlarda bu aracı açıp standart sistem izleme prosedürleri çalıştırıyorum. Bu işlemleri yapmak nasıl zaman kazanabilirim derken SSMS’in açılma esnasında dışarıdan parametre alabildiğini öğrendim. Bu da bu tür işlemler için kısayol sağladı.
Okumaya devam et

64 bit SSIS – Excel Connection Manager Kullanımı

SQL Server 2008 Integration Services içerisinde veri aktarımı esnasında Excel dosyasını kaynak veya hedef olarak kullanmamıza imkan tanıyan “Excel Source” ve “Excel Destination” bileşenleri bulunmaktadır.

Fakat bu bileşenleri 64 bit SQL Server 2008’in olduğu ortamda kullanmak istediğimizde aşağıdaki hatayla karşılaştık.
[Connection manager “Excel Connection Manager”] Error: SSIS Error Code DTS_E_OLEDB_EXCEL_NOT_SUPPORTED: The Excel Connection Manager is not supported in the 64-bit version of SSIS, as no OLE DB provider is available.
Bunun nedeni Excel Connection Manager’in 64bit sürümünün olmayışıdır. Bu bağlantı nesnesini kullanmak için hazırladığımız SSIS paketini 32bit modunda çalıştırmalıyız.
Okumaya devam et

The partner transaction manager has disabled its support for remote/network transactions

SQL Server içerisinde Linked Server, OPENROWSET, OPENQUERY, OPENDATASOURCE, RPC, BEGIN DISTRIBUTED TRANSACTION yöntemlerini kullanarak uzaktaki bir sunucudaki veritabanı üzerinde tanımlama ve düzenleme işlemlerini transaction yönetiminde yapmak için karşı sunucuda Distributed Transaction Coordinator (DTC) servisini aktifleştirmemiz gerekir. Yani aşağıdaki gibi bir sorgu çalıştırdığımızda eğer karşı makineden DTC çalışmıyorsa MSDTC on server ‘DW’ is unavailable. hata mesajını alırız.

BEGIN DISTRIBUTED TRANSACTION
SELECT * FROM DW.Deneme.dbo.Urun
ROLLBACK

Okumaya devam et

SQL Server’de Uyarı Log Dosyaları Yönetimi

SQL Server’de kullanıcıların girişlerini, hataları, uyarıları, backup sonuçları gibi iç sistemle veya kullanıcı işlemleriyle ilgili mesajları Log dosyalarına yazar. Bu dosyalar varsayılan olarak SQL Server’in kurulum klasörünün altıdaki Log klasörünün altında bulunur.
C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\Log
Bu klasörün altında ERRORLOG.1, ERRORLOG.2, ERRORLOG.3 . şeklinde dosyalar oluşturulur.
SQL Server her servis yeniden başladığında o tarihe ait yeni bir dosya oluşturur bir sonraki açılışa kadar aynı dosyayı log verilerini yazar. Bu da özellikle çok uzun süre açık kalan canlı sistemlerde log dosyalarının büyümesine neden olmaktadır. Bu da servisin dosyayı parse etmesi, sistem yöneticininin dosyada bir mesaj aramasını ağırlaştırır. Burada bir optimizasyon yapmak adına servisi kapatmadan SQL Server’in bundan sonra yeni bir log dosyasını oluşturmasını sağlayabiliriz. Bunun sp_cycle_errorlog prosedürü veya DBCC ERRORLOG komutu kullanılır. Bunlar birini çalıştırdığımızda otomatik olarak yeni bir log dosyası oluşacaktır. Böylece büyümüş olan log dosyaları daha küçük parçaları bölünmüş olur.
Burada diğer önemli konu SQL Server’in default olarak son 6 log dosyasını tutuyor olmasıdır. SQL Server’in dosyaları silmeden önce kaç dosya bırakacağını Management » SQL Server Logs menüsünü sağ tıklayıp Configure bölümünden ayarlayabiliriz.

“Configure SQL Server Error Logs” penceresindeki “Limit the number of error log files before they are recycled” seçeneğini aktifleştirip kaç dosyanın aktif olacağını belirleyebiliriz.

Sonuçta ne kadar log dosyası kayıtlarımızda bulunursa istenmeyen bir durum olduğundan o kadar eskiye gidip log dosyaları bizi yönlendirebilir.
SQL Server’de yönetimle ilgili log dosyalarını okumak için sys.xp_readerrorlog veya sp_readerrorlog prosedürleri kullanılır.
SQL Server’in güncel olarak kullandığı Error Log setine ait fiziksel dosyanın konumunu servis başladığında yazdığı log cümlelerinde aşağıdaki ifadeyi filtreleyerek öğrenebiliriz.

USE master
GO
xp_readerrorlog 0, 1, N'Logging SQL Server messages in file', NULL, NULL, N'asc'
GO

32 bit ve 64 bit Arasında Data Taşıma

32 bit sistemde koşturduğumuz SQL Server’in zamanla daha fazla belleğe ihtiyaç duyması veya daha güçlü bir makineye geçirirken yeni işletim sistemi kurmamız dolayısıyla 64 bit ortama geçme durumu olabiliyor. Forumlarda gelen sorulara bakıldığı zaman bu konuda bir endişe olduğu gözlemledim. Temelde işlemci seviyesinden bu mimarilerde disk format yapısı değişmediği ve SQL Server bu mimarilere özgü bir data veya log file oluşturmadığı için herhangi bir yöntemle veritabanını x64, x86 ve IA64 tabanlı sistemler arasında kolayca taşıyabiliriz. x86’de backup alıp x64’e sorunsuz bir şekilde restore edebiliriz. Aynı şekilde detach/attach yöntemini tercih edebiliriz. Aynı şekilde high availability için kullandığımız Log Shipping, Mirroring, Transactional / Merge Replication yöntemlerinde de çapraz mimariler arasında data aktarımı yapılabilir.

Transactional Replication – Subscriber Database Adını Değiştirme

Farklı lokasyonlarda bulunan şubelerle merkez arasında transactional replication kullanıyoruz. Tüm şubeler merkezdeki ana SQL Server üzerinde bulunan kendi kodlarıyla ilişkili veritabanına aktarılmaktadır. Gün geldi, merkezdeki veritabanlarının isimlerinde değişiklik yapmak istedik. Merkezdeki abone görevindeki veritabanın adını değiştirdiğimizde Distributor tarafında The process could not access database ‘Veritabanı Adı’ on server ‘MerkezSunucu Adı’. hatası almaya başladık. Yeniden başlangıç senkronizasyonunu yapmadan replikasyonun kaldığı yerden devam edebilmesi için ya “Replication » Local Publication” menüsünden eski subscription database kaydını silip “New Subscriptions” bölümünden yeni abonelik oluşturulur veya Job ve sistem tabloları üzerinde aşağıdaki değişiklikleri yapmak gerekir.
Okumaya devam et