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 "

.::YASAL UYARI::.

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