26 Haziran 2011 Pazar

14 Şekilde Yaratıcılık Nasıl Öldürülür?

Yaratıcılık tarifi zor bir kavram, derin bir mevzu. “Yaratıcılık doğuştan gelen bir yetenek midir?”, “Zeka ile ilişkisi var mıdır?”, “Öğrenilip, geliştirilebilir mi?” gibi sorulara cevap bulmak amacıyla sosyoloji ve psikoloji alanında tonlarca bilimsel çalışma yapılmıştır. Yaratıcılığı kısaca, bir işi herkesin yaptığından daha farklı yapabilme ve yeni fikirler geliştirebilme yeteneği olarak tanımlayabiliriz.

Harward Business Review’da yayınlanan “An anti-creativity checklist” (Yaratıcılığı önlemek için kontrol listesi) isimli çalışma gerçekten ilginç... Aynı konuyu Tufan Karaca da kendi blog sitesinde ele almış, çevirisi güzel olmuş, eline sağlık. Yapılan çalışmada sosyal ve iş yaşantımızda sıkça karşılaştığımız söylemleri görmek mümkün. Bazılarını tartışmalı bulabilirsiniz ama çoğu gerçek…

Listeye bir göz atalım;

Madde 1- Güvenli tarafta kalın, içinizden geçenleri dinleyin, elinizi taşın altına sokmayın… “Aman beni aptal sanmasınlar”, “Neden ben ortaya çıkayım”, “Boş ver bırak başkası yapsın.”, “Ya bu fikri aptalca bulurlarsa?”

Madde 2- Sınırlarını bil ve kendini koru… “Bana sorma”, “Ben anlamam”, “Nerden bileyim”

Madde 3- Yaptığınızın sadece bir iş olduğunu hatırlatın kendinize… “Ben bunun için para almıyorum.”, “Görev tanımımda bu iş yok”, “Yemek arası ne zaman?”

Madde 4- En akıllı olanın sen olduğunu göster ve sürekli şüpheci ol… “Bunu hiç bir zaman gerçekleştiremezsin.”, “Şirket yapımız buna uygun değil.”, ” Bu fikir şu fikir şu sebepten dolayı uygun değil.”

Madde 5- Bilen adamı oyna ve sürekli veri iste… “Pazar araştırmalarının sonuçları ne gösteriyor?”, ” Öyle olduğuna dair hiç bir ipucu göremiyorum.”

Madde 6- Geçmişe saygı duy ve geçmişteki olayları ve engelleri sürekli olarak örnekle… “Biz bunu hep böyle yaptık.”, “Madem bu kadar parlak bir fikir neden bugüne kadar kimse bunu uygulamadı? ”, “ Piyasa bunu hiç bir zaman kabullenmez.”, “Ama planımızın bir parçası değil bu.”

Madde 7- Çılgınlığı başlamadan durdur, engin iş ve piyasa bilginle yeni fikirleri daha baş gösterirken başını ez… “ Bu işe uygun fiyat modelini hiç bir zaman kuramazsın.”, “Tasarımı nasıl becereceksin?”, “ Varsayımlarını kabul etmiyorum.”, “Daha iş modelini bile kuramadım.”, “ Buna yatırım yapamayız.”

Madde 8- Deneyimlerini silah olarak kullan – oradaydım, daha önce denedim diye söyle… “ Bunu iki yıl önce denemiştik, olmadı.”, “Burada daha işlerin nasıl yürüdüğünü bilmiyorsun.”

Madde 9- Gözlerini ve aklını kapat… “Hiç bir şey değişmeyecek.”, “Bu teknik palavralara karnım tok.”, “ Bana işimi nasıl yapacağımı öğretemezsin.”, “ Sosyal ağlar konusundaki bu saçmalık nedir?”

Madde 10- Her zaman sorun olmadığını kabullen… “Zor bir yıldı, zaten ekonomi de kötüydü.”, “Gelecek çeyrek daha iyi olacak.” , “Çok iyi gidiyoruz.”

Madde 11- Müşterilerini küçümse … “, “Müşteriler bir yere gitmiyor.”, “ Henüz buna hazır değiller.”, “ İstedikleri bu değil.”, “ Buna alışık değiller.”

Madde 12- Bilmişlik yap, sürekli nasihat ver… “Kafanı öne eğ, işini yap.”, “ Düşünmeyi başkalarına bırak.”, “ Hiç bir şeye bulaşmadığım için ben bu koltuğa kadar gelebildim.”, “ Burnunu her şeye sokma.”

Madde 13- Yaratıcı eğilimli ve sıra dışı çalışanlardan sürekli şüphelen… “Sanatçı olanlardan, şiir yazanlardan, antropologlardan, işten anlamayanlardan, sıra dışı olan herkesten sürekli şüphe duy.” ,
“Neden onlara maaş veriyoruz ki?” , “Kim çağırdı onları bu toplantıya?”.

Madde 14- Ve bunların hiç birini beceremiyorsan bir yetişkin gibi davran yeter… “Bunun için vaktim yok”, “Randevu almış mıydınız?”, “Herkes işinin başına.”, “Gelecek yıl inşallah.”

Referanslar


Deniz KILINÇ

21 Haziran 2011 Salı

TSQL – Dış Kaynaklarla Çalışma (XML bağlantı)

SQL sunucuda veri tabanı sorguladığımız gibi dış kaynaklardan, veri dosyalarını sorgulamamız mümkündür. Dış kaynaklara bağlantı için, tüm bağlantı bilgilerini OLE DB içinde barındırır. Aynı veri kaynağına sürekli bağlantı için SQL’in Linked Server özelliği kullanılmalıdır.
OPENROWSET işlevini bir tablo sorgular gibi kullanabiliriz. OLE DB sağlayıcısının yetenekleri doğrultusunda insert, update ve delete komutlarıyla birlikte de kullanılabilir. OPENROWSET komutunun Bulk veri okuma için de desteği vardır.
Sistemin lokalindeki bir xml’e bağlantı kurulacaksa yine lokaldeki SQL servisinden login olunmalıdır.
Veri dosyalarıyla bağlantı kurabilmek için SQL servisinin Ad Hoc Distributed Queries özelliğinin açılması gereklidir.
 
sp_configure 'show advanced options',1
reconfigure with override
go
sp_configure 'Ad Hoc Distributed Queries',1
reconfigure with override
GO
XML dosyası okumak için Ornek.XML Dosyası:
<?xml version="1.0" ?>
<Kok>
<Rapor id="1" Tipi="Sabit">
  <Kodu>001</Kodu>
  <Adi>Borc Yaslandirma</Adi>
  </Rapor>
<Rapor id="2" Tipi="Dinamik">
  <Kodu>002</Kodu>
  <Adi>Musteri Listesi</Adi>
</Rapor>
</Kok>
XML veri okumak için iki farklı örnek kod aşağıda verilmiştir.
 

/* sp_xml_preparedocument Prosedüründe döküman sorgulayabilmek için değişken tanımlanır. */
DECLARE @xmlbelgeno INT

/* Sorgulanmak istenen XML Dokümanının içeriğinin aktarılacağı değişken oluşturulur. */
declare @xml xml

/* @xml değişkenin içeriği doldurulur. Dosya sisteminden OPENROWSET komutuyla çağırılabilir. */
SELECT @xml =BulkColumn FROM OPENROWSET (BULK 'C:\xml\Ornek.xml', SINGLE_CLOB) AS DATA

/* sp_xml_preparedocument prosedürü yardımıyla OPENXML için XML dosyası hazırlanır. */
EXEC sp_xml_preparedocument @xmlbelgeno OUTPUT, @xml

/* Veri Select komutuyla çağırılır. */
SELECT * FROM OPENXML(@xmlbelgeno,'Kok/Rapor', 2) WITH (Kodu VARCHAR(30), Adi VARCHAR(30),id INT, Tipi VARCHAR(30))

/*
OEPNXML komutunun;
1. parametresi hazırlanan dökümanın kodu ile çağırmak için,
2. parametresi XML dökümanının hangi dizinden sorgulanmaya başlanacağı belirlenir.
3. parametresi 1) XML Attiribute 2) XML Node 3)Tümü sorgulamak için seçim yapılır.

WITH komutu kullanılmadan çağırıldığında XML hiyerarşik yapısı ile birlikte Attiribute ve Node'ları aynı anda görebiliriz.

sp_xml_removedocument Komutu ile hazırlanmış ve sorgulanmış döküman silinir.
*/
EXEC sp_xml_removedocument @xmlbelgeno
Sonuç
OPENXML komutu flags parametresi = 1
OPENXML_UNIVERA_1
OPENXML komutu flags parametresi = 2
OPENXML_UNIVERA_2
OPENXML komutu flags parametresi = 3
OPENXML_UNIVERA_3
OPENXML komutu WITH komutu kullanılmadan
OPENXML_UNIVERA_4
Farklı bir XML bağlantı örneği de aşağıda verilmiştir.
 
DECLARE @xml xml SELECT @xml = BulkColumn FROM OPENROWSET (BULK 'C:\xml\Ornek.xml', SINGLE_CLOB) AS DATA

SELECT
     tr.Attr.value('./@id', 'INT') id
     , tr.Attr.value('./@Tipi', 'varchar(70)') Tipi
     , tr.Attr.value('.','varchar(500)') as [.]
     , tr.Attr.value('..', 'varchar(70)') [..]
     , tr.Attr.query('.') query
     , tr.Attr.query('*') [*]
from @xml.nodes('Kok/Rapor') tr(Attr)


OPENXML_UNIVERA_5
Bora GÜRSEL

15 Haziran 2011 Çarşamba

Heap, Clustered İndeks ve Nonclustered İndeks Data Yapıları - Bölüm 3 (Nonclustered İndeks Mimarisi)


4. Nonclustered İndeks Mimarisi

Nonclustered indeks aşağıdaki farklılıklar dışında B-tree yapısını clustered indeks gibi kullanır:
  • · Tablodaki data satırları, nonclustered anahtarlarına göre sıralanıp depolanmaz.
  • · Nonclustered indeksin leaf katmanı data page yerine indeks pagelerle düzenlenir.
Nonclustered indeksler tablo veya view üzerine heap veya clustered indekslerle tanımlanabilirler. Nonclustered indekste her indeks satırı, nonclustered indeks key value ve bir row locator bulundurur. Bu yer bulucu, clustered indeks veya heapteki anahtar değerine sahip satırı işaret eder.
Nonclustered indeksteki satır bulucu, ya bir satır göstergesidir ya da satırın clustered indeks anahtarıdır. Buna göre:
  1. Tablo clustered indeks içermeyen bir heap ise; row locator bir satırı işaret eder. Bu pointer, dosya tanıtıcı (ID), sayfa numarası ve page üzerindeki satırların numaralarından oluşur. Bütün olarak bu pointer Row ID (RID) olarak tanımlanır.
  2. Eğer tablo bir clustered indekse sahipse veya indeksli bir view ise; row locator satırın clustered indeks anahtarıdır. Eğer clustered indeks unique indeks değilse, SQL Server, uniqueifier denilen kendisinin ürettiği değerleri ekleyerek duplicate keyleri unique yapar. Bu dört byte veri kullanıcıya gösterilmez. Bu sadece nonclustered indekslerde clustered anahtarlarını kullanması gerektiği zaman eklenir. SQL Server data satırını, nonclustered indeksin leaf satırlarında saklanan clustered indeks anahtarlarını kullanıp clustered indeksi arayarak elde eder.
Şekil 1:
Non-Clustered_Index_1-UNIVERA

Included Column Indexes

Nonclustered indeksin işlevselliği, indeksin leaf seviyesine nonkey kolon denilen included kolonlar eklenerek genişletilebilmesidir. Key kolonlar indeksin her seviyesinde saklanabilirken, nonkey kolonlar sadece leaf seviyesinde saklanabilirler.
SQL Server’ın nonclustered indeksi nasıl oluşturduğunu görmek için bir tablo yaratıp kayıt girişi yapalım.
Örnek Sorgular : Örnekler\1.Ornek3.sql
 
Create Table EmpTable1
(  EmpId Int,
   EmpName Varchar(8000)      )
Tablolar ilk yaratıldıklarında ön değer olarak yaratılan bir indeks yoktur. Teknik olarak indeks içermeyen tablolar ‘Heap’ olarak adlandırılır. Oluşturduğumuz tablonun indeks içermediğini sysindexes sistem tablosundaki “Indid” kolon değerinin 0 olup olmadığını sorgulayarak emin olabiliriz. Sysindexes table her vertiabanında bulunan tablo track’lerini ve indeks bilgilerini içeren bir tablodur. Bu tablodaki “Indid” kolonu index kimliğini belirtir ve Indid = 0 tablonun indeks içermediğini yani “heap” olarak saklandığını gösterir.
Tabloya bazı kayıtlar ekleyip sonuçlarına bakalım:
 
Insert Into EmpTable1 Values (4, Replicate ('d',2000))
Insert Into EmpTable1 Values (6, Replicate ('f',2000))
Insert Into EmpTable1 Values (1, Replicate ('a',2000))
Insert Into EmpTable1 Values (3, Replicate ('c',2000))
Select EmpID From EmpTable1
Non-Clustered_Index_2-UNIVERA
Sonuçta görüldüğü gibi kayıtlar giriş yaptığımız sıra ile görüntüleniyor.
Şimdi bazı komutlarla tablomuzun page bilgilerini inceleyelim:
 
DBCC TRACEON (3604)
GO
Declare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id('EmpTable1')
DBCC ind(@DBID, @TableID, -1)
Non-Clustered_Index_3-UNIVERA
Şimdi DBCC PAGE komutuyla data pageleri inceleyelim.
DBCC page(dbid, fileno, pageno, option)
Dbid: Veritabanı ID
FileNo: Page in file numarası. Birden fazla dosya ile çalışmıyorsak 1 olacaktır.
Pageno: DBCC IND ile alacağımız page numarası
Option: 0, 1, 2, 3 olabilir.
 
DBCC TRACEON (3604)
GO
Declare @DBID Int
Select @DBID = db_id()
DBCC page(@DBID, 1, 73, 3)
Yukarıdaki sorgu ile 73 numaralı page içerisindeki dataya ulaşabilirim. Bu sonuç MSSQL’in verilerle kolon adlarının datapage içerisinde nasıl bulunduğunu gösterir.
Sonuç:
Record Type = PRIMARY_RECORD
EmpId = 4
EmpName = ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
dddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
İncelediğimiz sonuçlar indeks içermeyen tablonun SQL içerisinde nasıl depolandığını gösteriyor. Şimdi bu tabloya Empid kolonuna unique non-clustered yaratarak veriye nasıl etki ettiğine ve nasıl depolandığına bakacağız.
 
CREATE UNIQUE NONCLUSTERED INDEX EmpTable1_empid
ON EmpTable1(EmpId)
Non-Clustered index oluşturulduktan sonra, DBCC Ind ile tekrar bakıyoruz sonuca
 
DBCC TRACEON (3604)
GO
Declare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id('EmpTable1')3
DBCC ind(@DBID, @TableID, -1)
Non-Clustered_Index_4-UNIVERA
Elde ettiğimiz sonuç indeks page detaylarını da içeriyor. Yeni alanlara bakarsak; page 89 indeks page için tahsis edilmiş page detayını gösterir, page 89 da indeks page detayını gösterir.
MSSQL indeks page için bir page (PageType=10) yaratır ve indeksin kullandığı page numarasını gösterir.
 
DBCC TRACEON (3604)
GO
Declare @DBID Int
Select @DBID = db_id()
DBCC page(@DBID, 1, 89, 3)
Sonuç:
IAM: Single Page Allocations @0x61D7C08E
Slot 0 = (1:80)
 
DBCC TRACEON (3604)
GO
Declare @DBID Int
Select @DBID = db_id()
DBCC page(@DBID, 1, 80, 3)
Non-Clustered_Index_5_Heap_RID-UNIVERA
SQL indeks kolonu sıralayarak yerleştirir. “HEAP RID” kolonu satır göstergesidir.
Satır göstergesi iki şekilde görüntülenir:
1. Tabloda clustered indeks varsa, satır göstergesi clustered indeks anahtar değeridir.
Bir tablodan tek satır döndürmek için Non-clustered indeks daha kullanışlıdır.
Örneğin; EmpId kolonuna non-clustered indeks yaratılmış tablodan EmpId vererek sorgu çektiğimizde EmpId ile eşleşen doğru sayfa ve satırdaki girişi bulmak için indekse bakar ve doğrudan bu page ve rowa gider. Bu da kayıt sorgulamayı oldukça hızlandırır.
Şimdi tablomuza satır ekleyelim clustered indeks ile non-clustered indeks yapısına bakalım. Kayıt ekledikten sonraki tablo görüntüsü aşağıdaki gibi olsun:
 
INSERT INTO EmpTable VALUES (10, Replicate ('j',4000))
INSERT INTO EmpTable VALUES (2, Replicate ('b',4000))
INSERT INTO EmpTable VALUES (5, Replicate ('e',4000))
INSERT INTO EmpTable VALUES (8, Replicate ('h',4000))
INSERT INTO EmpTable VALUES (9, Replicate ('i',4000))
INSERT INTO EmpTable VALUES (7, Replicate ('g',4000))
Select EmpID From EmpTable1
Non-Clustered_Index_6-UNIVERA
Sonuçta görüldüğü gibi veri hala bizim giriş yaptığımız sırada. Çünkü non-clustered indeks eklemek verinin nasıl saklandığını değiştirmez veri pagelerde sıralama yapar.
Şimdi DBCC Ind komutuyla yeni satırların nasıl eklendiğine bakalım:
 
DBCC TRACEON (3604)
GO
Declare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id('EmpTable1')
DBCC ind(@DBID, @TableID, -1)
GO
Non-Clustered_Index_7-UNIVERA
· Metot 1:
DBCC TRACEON (3604)
GO
Declare @DBID Int
Select @DBID = db_id()
DBCC page(@DBID, 1, 80, 3)
Non-Clustered_Index_8-UNIVERA
Yukarıdaki sonuçta görüldüğü gibi SQL Server’da indeks kolonun sıralanarak yerleştiriyor. “HEAP RID” kolonu satır göstergesini belirtiyor.
Satır göstergesinin iki tipi var demiştik. Yukarıdaki örnekte satır göstergesinin birinci metodunu görmüş olduk.
· Metot 2:
Şimdi de clustered ve non-clustered indeks içeren tabloda ikinci metodu inceleyelim. Öncelikle EmpTabl1 tablosuna bir kolon ekleyelim ve buna clustered indeks oluşturalım:
 
Alter Table EmpTable1 Add EmpIndex Int IDENTITY(1,1)
Kolon ekledikten sonra DBCC Ind komutuyla kontrol edersek de görebiliriz, kolon eklemek SQL Server tarafından ayrılan toplam page sayısını değiştirmez.
 
CREATE UNIQUE CLUSTERED INDEX EmpTable1_empindex
ON EmpTable1(EmpIndex)
Clustered Indeks eklendikten sonra page yapısı aşağıdaki gibi değişir:
 
DBCC TRACEON (3604)
GO
Declare @DBID Int, @TableID Int
Select @DBID = db_id(), @TableID = object_id('EmpTable1')
DBCC ind(@DBID, @TableID, -1)
Non-Clustered_Index_9-UNIVERA
90 ve 47 numaralı pageler page yerleşim detaylarını içerir. 73,110 ve 121 data page detaylarıdır.
Şimdi 90 ve 47 pagelerine bakalım:
 
DBCC TRACEON (3604)
GO
DBCC page(12, 1, 115, 3)
Non-Clustered_Index_10-UNIVERA
Yukarıdaki sonuç, veri page bağlantısı içeren(ChildPageId) clustered indeksi gösteriyor. EmpId kolonu, sayfada satır başlangıcını içeren indeks kolonudur.
 
DBCC TRACEON (3604)
GO
DBCC page(12, 1, 175, 3)
Non-Clustered_Index_11-UNIVERA
Yukarıdaki sonuç ile Metot 1 ve Metot 2 arasındaki farkı görebiliriz. Metot 1’de pageler satır göstergesini belirtirken Metot 2 deki clustered indeks anahtarlarını gösteriyor.
Metot 1 ve Metot 2 arasındaki en büyük fark datapagedeki satıra bağlanma şeklidir.
Referanslar

Serap PARLAK