2008-06-13

SQL Server 2008 ile Oracle'ın Bazı Özelliklerinin Karşılaştırılması

Geçen gün SQL Server 2008 White Papers ı okurken; SQL Server 2008 ile Oracle 11g nin bazı özelliklerinin karşılaştırılması dikkatimi çekti. Merak ettiğim bir konuyu sizlerle de paylaşmak istedim. Ayrıntılı bilgi için SQL Server 2008 Compared to Oracle Database 11g White Paper ını okuyabilirsiniz.

Hem SQL Server 2008 hem de Oracle 11g de olan bazı özellikler:
  1. Feature Microsoft OracleResource Governor
  2. Partition-aligned indexed views

Sadece SQL Server 2008'de olan özellikler:

  1. PowerShell
  2. Policy-Based Management
  3. Filtered indexes
  4. Advanced sparse columns
  5. Multithreaded partition access
  6. Column-prefix compression
  7. Module signing using certificates
  8. SQL Server Data Services

2008-06-12

SPARSE Column and Filtered Index

Merhaba Değerli Okuyucular,

Bugün de CTP5/CTP6 ve RC0 sürümlerini inceleyip, kurcalayıp, test edip bir yanlışlıklarını gördükce sevgili Microsoft amcamıza bugları arzı endam eylemeye çalıştığımız SQL Server 2008'i tanıma ve yeniliklerini keşfetme serüvenümüze kaldığımız yerden devam edeceğiz.

Elalem yapmış bana ne demiyoruz. Elalemin yaptığını bari keşfedip kullanalım diyoruz. İşimiz SQL Server olunca gücümüz de SQL Server oluyor haliyle. SQL ile yatıp SQL ile kalkıp SQL ile çay araları veriyoruz. Aranızdan kıs kıs gülüp alt üstü işiniz gücünüz 3 harfli bir kelime. Gelin görün ki bu 3 harf ile hangi kombinasyonlar ortaya çıkıyor(Dostlar arasında kalsın; düşmanlara çaktırmayın:) 3 harfli bir kombinasyonun en fazla 6 farklı çeşidi olur )?

Lafı fazla uzatmadan ve sizleri SQL'den soğutmadan edebi metinleri bırakıp işin teknik kısmına gelelim.

SQL Server 2008 ile birlikte sparse column ve filtered index geliyor. Bana ne demeyin bakarsınız işinizi kolaylaştırıp hızlandırır. Benden söylemesi ve uyarması gerisi size kalmış.

Sparse column ı özellikle entity yapısındaki kayıtlarımız için kullanabiliriz. Onlarca alanınız var ama bu alanlarınızın büyük çoğunluğu boş(null), çok az kısmı dolu ise sparse column özelliği tam size göre. Sparse column null değerli alanlar için 0 diğer alanlar için 2-4 byte arasında yer kaplıyor. Sparse column ile yerden %20-%40 oranında tasarruf sağlanabilir aynı şekilde %20 ye varan CPU performansında iyileşme görülebilir. Daha detaylı bilgi için bkz. Using Sparse Columns

SQL Server 2008 ile birlikte ilk defa tanışacağımız hatta severek kullanacağımız Filtered Index; klasik indexlerimize WHERE koşulunun eklenmiş hali. Filtered Index belirli koşullar altındaki kayıtları indexliyor.

Örneğin Vatandaslik tablomuzda 1953 yılından önce doğan vatandaşlarımızı bir indexte tutmak isteyelim:

CREATE NONCLUSTERED INDEX [indVatandas1953] ON [dbo].[Vatandaslik]
(
[DogumTarihi] ASC
)
WHERE ([DogumTarihi]<'1953-01-01')
ON [PRIMARY]

Peki iyi güzel de bu bize ne sağlayacak? Tabiki bu sayede index'imiz daha az yer kaplayıp daha hızlı olacak. Filtered index ile ilgili detaylı bilgi için bkz.Filtered Index Design Guidelines

Not:Filtered Index ile ilgili SQL kodu SQL Server 2008 RC0 ile test edilmiştir.

2008-06-10

SQL Server 2008 RC0 Yayında

Microsoft, SQL Server 2008 Release Candidate 0'ı yayınladı. SQL Server 2008 RC0'ı denemek isteyen okuyucular Microsoft sitesinden kendilerine uygun paketleri indirebilirler.

2008-06-02

SQL Server 2008: Table Valued Parameters

SQL Server 2008 ile birlikte stored procedure parametrelerinde tablo kullanabileceğiz. Bu oldukça güzel bir özellik; eminim bir çoğunuz benim gibi bu özelliği bekliyordu.

Şehir adlarını bir tablo üzerinden toplu bir şekilde bir SP sayesinde ekleyelim. SP miz parametre olarak tablo alacak. Bunun için öncelikle bir test tablosu oluşturalım:

CREATE TABLE TestCity(
[CityId] [int] NOT NULL,
[Name] [varchar](64) NOT NULL
)

Bir tablo tipi oluşturalım:

CREATE TYPE [CityType] AS TABLE(
[CityId] [int] NOT NULL,
[Name] [varchar](64) NOT NULL
)

TestCity tablosuna kayıt ekleyecek SP mizi yazalım:

CREATE PROCEDURE usp_InsCity
@TableParam CityType READONLY
AS
SET NOCOUNT ON
BEGIN
INSERT INTO TestCity Select CityID, Name from @TableParam
END

Şimdi de tem tabloya şehirleri ekleyip kayıt ekleyen SP mizi çalıştıralım:

DECLARE @tmpTest AS CityType

INSERT INTO @tmpTest(CityID,Name) VALUES(6,'İzmir'),(34,'İstanbul'), (63,'Şanlıurfa')
--Kayıt eklemelerini toplu şekilde yapıyoruz:)

EXEC usp_InsCity @tmptest

Not: Tüm Kodlar SQL Server 2008 CTP6 ile test edilmiştir.

2008-06-01

Bir Nesnenin Detay Bilgilerini Görme

Merhaba Değerli Okuyucular,

SQL Server'da bir nesne üzerinde bir şeyler yapmak istediğimde o nesnenin detay bilgilerini bilmek isterim. Örneğin bir tabloya yeni bir alan ekeleneceği zaman bu tablo ne zaman oluşturulmuş, en son ne zaman değişikliğe uğramış, üzerinde kaç Insert, Update, Delete triggerı var, kaç satırdan oluşuyor, fiziksel büyüklüğü ne kadar, tablonun alanları, tablo üzerindeki indexler ve constraintler vs gibi bilgileri anında görebilirsem tablo üzerinde daha sağlıklı bir değişiklik yapma şansım olur. Tüm bu özellikleri bir SP üzerinde yapıp tek noktadan tüm bilgilere erişme ihtiyacı hissettim. Diğer şekilde tablonun bu özelliklerine ulaşmak için tek tek ilgili yerlere bakmak bana sıkıcı ve hammalık gibi geliyor. Bu yüzden SQL server üzerindeki bir nesnenin detay bilgilerini öğrenmek için ObjectInfo adında bir SP oluşturdum. Sizlere de bir faydası dokunur diye günlüğümde yayınlıyorum:

CREATE PROCEDURE [dbo].[ObjectInfo]
@ObjectName [varchar](255) = null
WITH EXECUTE AS CALLER
AS
/*
Yazan : Mehmet GÜZEL
Tarih : 30.05.2005
Açıklama: İlgili nesnenin detay bilgilerini verir.
*/
SET NOCOUNT ON
DECLARE @Type VARCHAR(64)
BEGIN
SELECT @Type = type
FROM sys.objects
WHERE name=@ObjectName
IF @Type ='U'
BEGIN
SELECT OBJECT_NAME(O.object_id),
O.type Type,
O.type_desc AS TypeDesc,
O.create_date AS Create_Date,
O.modify_date AS modify_date,
MAX(S.rowcnt) AS Rows,
8.0*SUM(S.reserved) AS SizeKB,
(SELECT COUNT(1) FROM sys.trigger_events WHERE type_desc='INSERT' AND object_id =O.object_id) AS InsertTrCount,
(SELECT COUNT(1) FROM sys.trigger_events WHERE type_desc='UPDATE' AND object_id =O.object_id ) AS UpdateTrCount,
(SELECT COUNT(1) FROM sys.trigger_events WHERE type_desc='DELETE' AND object_id =O.object_id) AS DeleteTrCount
FROM sys.all_objects O LEFT OUTER JOIN sys.sysindexes S ON O.object_id =S.id
WHERE O.name=@ObjectName
GROUP BY O.object_id,
O.type,
O.type_desc,
O.create_date,
O.modify_date
END
IF @Type ='P'
BEGIN
SELECT type AS Type,
type_desc AS TypeDesc,
create_date AS CreateDate,
modify_date AS ModifyDate
FROM sys.procedures
WHERE name=@ObjectName
END
EXEC sp_help @ObjectName
RETURN 0
END


Not: SP, SQL Server 2005/2008 ortamında geliştirilip derlenmiştir, SQL Server ortamında syntax hataları verebilir.

2008-05-28

Bu Bildirinin Altına İmzamı Atıyorum

Sayıları binleri geçen ve başını akademisyenlerin çektiği aşağıdaki bildiriyi ben de imzalıyorum.

"Saygıdeğer Yargıçlar;
21 Mayıs 2008 günü, “adına yargı yetkisi kullanmaktan onur duyduğu Yüce Milletiyle paylaşmak gereğini duyduğunuz” bir bildiri yayınladınız. Adına yargı yetkisi kullandığınız bu milletin bir bireyi olarak, kullandığınız yetki ve sorumluluğunuzun çerçevesini hatırlatma ihtiyacı hissettim.
“Demokratik, lâik ve sosyal hukuk devleti” idealine bağlı, Cumhuriyetin temel niteliklerini benimsemiş bir birey olarak;
Toplumun çözüm bekleyen sorunlarının başında gelen yargısal sorunların çözümünde hiç bir katkı yapmayacaksanız,
İşgal ettiğiniz makamlarınızı siyasal görüşlerinize alet edecekseniz,
Toplumdan “anayasayı değiştireceğim” vaadiyle oy alan bir partinin yeni anayasa yapma girişimini ve Meclis’in Anayasa yapma yetkisini engellemeye kalkacaksanız,
Ve bunu millet adına karar verme yetkinizi kullanarak yapacaksanız,
Yayınladığınız bildiriyle halen Anayasa Mahkemesi’nde dava konusu olan, Anayasa maddeleri değişiklikleri hakkındaki davanın seyrini etkiyelecek şekilde doğrudan yargıya müdahale edecekseniz,
Ve hatta, Anayasa maddelerini değiştirmek gibi asli yetkisini kullanan yasama organını hedef gösterecekseniz,
Avrupa Birliği müzakereleri sürecinde öncelikli olarak yapılması gereken yargı reformuna pozitif katkı yapmak bir yana, sırf AB sürecini baltalamak için reformlara karşı çıkacaksanız,
Bireyi, devlet dahil her türlü otoritenin baskısına karşı koruyup, onun haklarını temin edecek bir hukuk anlayışını benimsemeyecek; devleti, bireyin ve milletin önünde ve üstünde tutacak ve kararlarınızı buna göre verecekseniz,
Benim adıma karar vermeyin.

Yukaridaki metni benimsiyorsaniz lutfen
Adinizi Soyadinizi yazip `bu bildiriye katiliyorum` ibareli bir emaili
benimadimakararvermeyin@gmail.com
adresine gonderiniz...
Benim Adima Karar Verme Platformu "

2008-05-24

sp_helptext

Merhaba Değerli Okuyucular,

Bugün SQL Server'ı kullanırken işimize çok yaracak bir SP ye değineceğim: sp_helptext. sp_helptext ile bir rule, default, unencrypted stored procedure(sp), user defined function(udf), trigger, veya view'ın text içeriğini görüntüleyebilirsiniz. Böyle yararlı bir sp olmadığı zaman tek tek ilgili nesneleri bulup scriptlerini almak ne kadar zahmetli olduğunu yaşayan arkadaşlara anlatmama gerek yok ama yaşamayan arkadaşlar zorluğu yaşadıktan sonra bana hak vereceklerdir.

sp_helptext in syntax'ı aşağıdaki gibidir:

sp_helptext [ @objname = ] 'name'

Şimdi bir örnek ile olayı daha iyi kavrayalım. spKonuyaPuanVer sp sinin içeriğini görüntülemek için

sp_helptext 'spKonuyaPuanVer '

yazmamış yeterli olacak. Bu komutun sonucunda ilgili SP nin text içeriği ekrana dökülür. SQL Server'da bir nesnenin SQL kodunu mu merak ediyorsunuz buyrun size sp_helptext. Tabi bu sp ile SQL Server'ın system sp, view ve diğer bileşenlerinin kodunu da görüntüleyebilirsiniz. Böylelikle merak ettiğiniz herhangi bir nesnenin nasıl kodlanğını görme şansınız olacak.

Geçen haftalarda sorduğum sorunun cevabı olan sp_databases SP nin kodunu böylelikle vermiş olayım:) Bunun için

sp_helptext 'sp_databases'

kodunu yazmamız yeterli olacak. Bu scriptin sonucundan sp_databases sp nin içeriğini aşağıdaki gibi alırız.

create proc sp_databases
as
set nocount on
declare @name sysname
declare @SQL nvarchar(600)
/* Use temporary table to sum up database size w/o using group by */
create table #databases (
DATABASE_NAME sysname NOT NULL,
size int NOT NULL
)

declare c1 cursor for
select name from master.dbo.sysdatabases
where has_dbaccess(name) = 1 -- Only look at databases to which we have access

open c1
fetch c1 into @name

while @@fetch_status >= 0
begin
select @SQL = 'insert into #databases
select N'''+ @name + ''', sum(size)
from ' + QuoteName(@name) + '.dbo.sysfiles'
/* Insert row for each database */
execute (@SQL) fetch c1 into @name
end
deallocate c1

select DATABASE_NAME,
DATABASE_SIZE = size*8,/* Convert from 8192 byte pages to K */
REMARKS = convert(varchar(254),null) /* Remarks are NULL */
from #databases
order by 1

2008-05-14

Bilgeliği Kimden Öğrendin?

Lokman Hekim'e "Bilgeliği kimden öğrendin?" diye sorduklarında ondan şu cevabı almışlar:
Körlerden öğrendim. Çünkü onlar elindeki değnekle tam araştırmadan adım atmazlar. Basacakları yerin sağlam olduğundan emin olduktan sonra adım atarlar... Bundan dolayı ben de bir şey yapacağım zaman düşünür, faydalı ise konuşur, yararlı ise yaparım... Faydasız ise bırakmayı ve susmayı tercih ederim.

Kaynak: Zafer

Bugün sabah servisi beklerden gözleri görmeyen birisinin yolda yürüşünü, karşıdan karşıya geçişini, ardından otobüs durağına gidip otobüse binişini hayret içerisinde izledim. Yolu bulması, durakta durması ve bineceği otobüsü bilmesi beni şaşırttı. Demek ki Allah herkese yolunu bulacak bir yöntem yada kalp gözü bahşediyor.

"SQL Server 2005'te Veritabanı İsimleri ve Fiziksel Büyüklükleri" Sorusunun Cevabı

Sevgili okuyucu SQL Server 2005 ile ilgili bu sorumun ağır olduğunu itiraf etmek zorundayım. Zira her üç cevap şıkkı da birbirine oldukça yakındı ve tüm şıklar itina ile seçilmişti.

Sorduğum sorunun doğru cevabı EXEC sp_databases olacaktı. Soruyu cevaplayan okuyucularımın %43 ancak doğru cevabı bilebildi. Doğru cevabı veren tüm okuyucularımı tebrik ediyorum ve diğer katılımcı arkadaşlara da katılımları için teşekkür ediyorum.

Cevap şıklarının arasındaki ince farkları görebilmek için kodları test etmenizi öneririm. Bir sonraki soru ve cevaplarda buluşuncaya dek bol SQL i günler diliyorum.

2008-05-13

SQL Server 2008'e Merhaba Dedik

print 'Merhaba SQL Server 2008 CTP ' --"Merhaba Dünya" vazgeçilmezimizden esinlenerek:)

Birkaç gün önce SQL Server 2008'in February 2008 CTP sini kurdum. SQL Server 2008 çıkmadan bir inceleyip test edeyim dedim. İlk ihtiyacım olan backup/restore ı test ettim. Yaklaşık 22 GB lık bir veritabanımın sıkıştırılmış backup'ı yaklaşık 10 dakika sürdü. Ve backup dosyamın boyutu 2 GB civarındaydı:) Aynı şekilde bu sefer backup'tan restore ettim; restore işlemi yaklaşık 8 dakika sürdü. Backup compress hem hız hem de yer bakımından SQL Server'a artı bir özellik katmış. Özellikle backup dosya boyutlarından dolayı yer sıkıntısı yaşan okuyuculara kullanmalarını tavsiye edebilirim.

2008-04-28

SQL Server'a Kurulan Bağlantıların Uygulamaya Göre Sayısı

SQL Server'a kurulan bağlantıların toplamını uygulamaya göre aşağıdaki SQL ile bulabilirsiniz:

SELECT Program_Name, COUNT(1) AS TotalConnection
FROM Master..sysprocesses
WHERE ecid=0
GROUP BY Program_Name
ORDER BY COUNT(1) DESC

.::YASAL UYARI::.

©2004-2023 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.