T-SQL ile 20 milyon satırlık müşteri verisi üretme

T-SQL ile 20 milyon satırlık müşteri verisi üretme

Bu yazıda belirli bir rastgelelik kuralı ile gerçek insan isimleri ve adreslerden oluşan 20 milyon satırlık bir müşteri veri setinin T-SQL yardımıyla nasıl oluşturulabileceğini anlatıyoruz.
Ömer Çolakoğlu21 Haz 2021

Veri bilimini besleyen en önemli şey bildiğiniz gibi verinin kendisi. Tabii gerçek veriden bahsediyorum. Ancak her zaman gerçek veri bulma imkanımız olmuyor. İşte bu yüzden gerçek veriye en yakın şekilde veri nasıl üretilir onu anlatacağım. Zira bu konu çok önemli. Elde veri olmadığı için birçok projenin üzerinde çalışılamıyor. Oysa veri türetmek özünde oldukça kolay. Bu yazı ihtiyacınız olan her türlü veriyi üretmek adına aklınızda çeşitli fikirler canlandırmayı da amaçlıyor.

Çalışmada tüm işlemi SQL Server üzerinde T-SQL kodları ile gerçekleştireceğiz. Bu vesile ile T-SQL’in yeteneklerine de tanıklık etmiş olacaksınız.

Gelelim oluşturmak istediğimiz verinin yapısına. Bir müşteri veri seti oluşturacağız. İhtiyaç duyduğumuz alanlar ise aşağıdaki gibi.

İşlemleri yazıyı okurken benimle birlikte yapmak isterseniz ilgili SQL Server backup dosyasını bu bağlantıdan indirip kendi sisteminizde restore edebilirsiniz. Restore işlemi için ise backup dosyası SQL Server 2019 sürümünden alındığı için SQL Server’ınızın 2019 olması gerekiyor. İndireceğiniz CRM.bak dosyasını ise erişmesi kolay bir yere kopyalayın. Örneğin ben c:\material içine kopyaladım. Yedekten dönerken dosyayı bulması kolay oluyor.

Çalışmaya başlamak için Databases klasörüne sağ tıklayıp Restore Database diyoruz.

Device deyip üç noktaya tıklıyoruz.

Çıkan ekranda Add butonuna tıklıyoruz.

İndirdiğimiz CRM.bak dosyasını seçiyoruz.

OK butonuna basarak restore işlemini başlatıyoruz.

Restore işlemi tamamlandı.

Veri tabanımızı başarı ile yedekten döndük ve artık üzerinde çalışabilecek durumdayız.

20 milyon satırlık müşteri verisini oluşturmak için bazı verilere ihtiyacımız var.

Örneğin adsoyad alanını oluşturmak için Türkiye’deki isimlerin bulunduğu bir Names tablosu ve Türkiye’deki soy isimlerin bulunduğu bir Surnames tablosu. Bu tablolardaki değerleri rastgele birleştirirsek oldukça fazla yapay ad soyad elde edebiliriz. Veri tabanımızda her iki tablo da mevcut.

Names tablosunda isimler ve cinsiyet bilgisi bulunuyor. Satır sayısı ise 564.

Aynı şekilde Surnames tablosunda da Türkiye’de kullanılan soy isimler var. Orada ise 7340 satır bulunuyor.

Şimdi belirli bir rastgelelik ile bu isim ve soy isimlerden birer tanesini çekerek yeni bir kişinin adı ve soyadını oluşturabiliriz.

Bu işlemi T-SQL ile aşağıdaki gibi yapabiliyoruz.

--@NAME İSMİNDE BİR DEĞİŞKEN TANIMLIYORUZ.
DECLARE @NAME AS VARCHAR(100)
--RASTGELE OLUŞACAK BİR ID DEĞERİ İÇİN BİR DEĞİŞKEN TANIMLIYORUZ.
DECLARE @RANDID AS INT
--RAND() FONKSİYONU İLE 0 İLE 1 ARASINDA ONDALIK BİR RASTGELE DEĞER BULUYORUZ
--BULDUĞUMUZ RASTGELE DEĞER İLE 564 Ü ÇARPTIRARAK RANDID DEĞERİNİ BELİRLİYORUZ
SET @RANDID=RAND()*564
--ELDE ETTİĞİMİZ @RANDID DEĞERİNİ SORGUYA PARAMETRE OLARAK GÖNDERİYORUZ VE RASTGELE BİR KAYIT ÇEKİYORUZ
SELECT TOP 1 @NAME=NAME_ FROM NAMES WHERE ID=@RANDID
--RASTGELE ÇEKTİĞİMİZ BİR SATIRLIK KAYITTAN DÖNEN @NAME DEĞERİNİ VE BULDUĞUMUZ @RANDID DEĞERİNİ ÇEKİYORUZ
SELECT @RANDID AS RANID, @NAME AS NAME_

Görüldüğü gibi sorgu sonucunda karşımıza rastgele çıkan ID 306 ve tabloda bu ID'ye karşılık gelen isim Erol.

Aynı işlemi Surnames tablosu için de yaparak rastgele bir soy isim elde edelim.

--@SURNAME İSMİNDE BİR DEĞİŞKEN TANIMLIYORUZ.
DECLARE @SURNAME AS VARCHAR(100)
--RASTGELE OLUŞACAK BİR ID DEĞERİ İÇİN BİR DEĞİŞKEN TANIMLIYORUZ
DECLARE @RANDID AS INT
--RAND() FONKSİYONU İLE 0 İLE 1 ARASINDA ONDALIK BİR RASTGELE DEĞER BULUYORUZ
--BULDUĞUMUZ RASTGELE DEĞER İLE 564 Ü ÇARPTIRARAK RANDID DEĞERİNİ BELİRLİYORUZ
SET @RANDID=RAND()*7340
--ELDE ETTİĞİMİZ @RANDID DEĞERİNİ SORGUYA PARAMETRE OLARAK GÖNDERİYORUZ VE RASTGELE BİR KAYIT ÇEKİYORUZ
SELECT TOP 1 @SURNAME=SURNAME FROM SURNAMES WHERE ID=@RANDID
--RASTGELE ÇEKTİĞİMİZ BİR SATIRLIK KAYITTAN DÖNEN @SURNAME DEĞERİNİ VE BULDUĞUMUZ @RANDID DEĞERİNİ ÇEKİYORUZ
SELECT @RANDID AS RANID, @SURNAME AS SURNAME

Rastgele veri çekmek için bir başka yöntem daha var. O da ORDER BY NEWID() komutu. Ancak bu komut bizim yöntemimize göre özellikle büyük tablolarda görece daha yavaş çalıştığı için tercih etmiyoruz.

Bu aşamada cinsiyet yani Gender alanı da Names tablosunda yer aldığı için onu da aynı şekilde çekebiliriz. NameSurname alanı ise Names+’ ‘+Surnames alanlarının birleşimi. Şimdi bu üç bilgiyi çekecek sorguyu yazalım.

DECLARE @GENDER AS VARCHAR(1)
DECLARE @NAME AS VARCHAR(100)
DECLARE @SURNAME AS VARCHAR(100)
DECLARE @RANDID AS INT
SET @RANDID=RAND()*564
SELECT TOP 1 @NAME=NAME_,@GENDER=GENDER FROM NAMES WHERE ID=@RANDID
SET @RANDID=RAND()*7340
SELECT TOP 1 @SURNAME=SURNAME FROM SURNAMES WHERE ID=@RANDID
SELECT @NAME AS NAME_,@SURNAME AS SURNAME,@GENDER AS GENDER,@NAME+' '+@SURNAME AS NAMESURNAME

Görüldüğü gibi rastgele Ad, Soyad, Cinsiyet, AdSoyad alanlarından Eda ÇAĞLIKÇÖSE isimli bir kadın müşteri bilgisi oluştu.

Sırada doğum tarihi var.  Onun için de bir değişken tanımlayacağız. Doğum tarihi 01.01.1950 ile 01.01.2000 yılları arasında rastgele bir tarih olsun. Bunun için DateAdd fonksiyonunu kullanacağız. DateAdd fonksiyonu bir tarihe gün, ay, yıl gibi değerlerden bir değer ekleyerek yeni bir değer elde etmemizi sağlar.

Örneğin aşağıdaki gibi 01.01.1950'ye 5 yıl eklersek 01.01.1955 tarihini buluruz. 300 gün eklersek 28.10.1950 tarihini buluruz.

SELECT DATEADD(YEAR,5,'1950-01-01')
--1955-01-01 00:00:00.000
SELECT DATEADD(DAY,300,'1950-01-01')
--1950-10-28 00:00:00.000

Şimdi bu yöntemi kullanarak rastgele bir doğum tarihi elde edelim. Bunun için 01.01.1950 tarihine 2000 yılına kadar rastgele bir gün sayısı eklememiz gerekiyor. Aradaki yıl sayısı 50. Gün sayısı ise 365 x 50 = 18 250. 

DECLARE @GENDER AS VARCHAR(1)
DECLARE @NAME AS VARCHAR(100)
DECLARE @SURNAME AS VARCHAR(100)
DECLARE @RANDID AS INT
DECLARE @BIRTHDATE AS DATE
SET @RANDID=RAND()*564
SELECT TOP 1 @NAME=NAME_,@GENDER=GENDER FROM NAMES WHERE ID=@RANDID
SET @RANDID=RAND()*7340
SELECT TOP 1 @SURNAME=SURNAME FROM SURNAMES WHERE ID=@RANDID
SET @BIRTHDATE = DATEADD(DAY,RAND()*365*50, '1990-01-01')
SELECT @NAME AS NAME_,@SURNAME AS SURNAME,@GENDER AS GENDER,
@NAME+' '+@SURNAME AS NAMESURNAME, @BIRTHDATE AS BIRTHDATE

Artık rastgele doğum tarihimiz de oluştu.

Sırada e-posta adresi var. E-posta adresini şöyle düşünebiliriz: Adın ilk üç harfi, ”_” ve soy isim. Tabii burada Türkçe karakterler İngilizceye dönüşecek ve adres küçük harflerle yazılacak. Bir de Hotmail, Gmail gibi e-posta sağlayıcılardan herhangi birini rastgele seçmesi gerekiyor.

Öncelikle Türkçe karakter sorununu çözelim. Bunun için bir fonksiyon yazıyoruz.

create FUNCTION [dbo].[TurkishCharacter](@STR AS VARCHAR(1000)) RETURNS VARCHAR(1000)
AS
BEGIN
DECLARE @RESULT AS VARCHAR(1000)
SET @RESULT=@STR
SET @RESULT =REPLACE(@RESULT,'İ','I')
SET @RESULT =REPLACE(@RESULT,'Ç','C')
SET @RESULT =REPLACE(@RESULT,'Ş','S')
SET @RESULT =REPLACE(@RESULT,'Ö','O')
SET @RESULT =REPLACE(@RESULT,'Ğ','G')
SET @RESULT =REPLACE(@RESULT,'Ü','U')
RETURN @RESULT
END

Fonksiyonumuzu deneyelim.

SELECT DBO.TurkishCharacter('Ömer ÇOLAKOĞLU')


Bize ismin ilk üç harfi ve soy adın tamamı gerekiyor. Bunun için Left fonksiyonunu kullanıyoruz.

SELECT Left(DBO.TurkishCharacter('Ömer’),3)


Soyad ile birleştirerek bir e-posta oluşturabiliriz. Ancak hepsini küçük harfe çevirmemiz gerekiyor. Bunun için kullanacağımız komut ise Lower komutu.

SELECT Lower( Left(DBO.TurkishCharacter('Ömer'),3) + '_' + DBO.TurkishCharacter('ÇOLAKOĞLU'))


E-postanın @ işaretinden önceki kısmı tamam. Sonraki kısmına bakalım. Belirli bir rastgelelik ile Hotmail, Gmail, Yahoo, Live, Outlook gibi değerler alsın.

DECLARE @GENDER AS VARCHAR(1)
DECLARE @NAME AS VARCHAR(100)
DECLARE @SURNAME AS VARCHAR(100)
DECLARE @RANDID AS INT
DECLARE @BIRTHDATE AS DATE
DECLARE @EMAIL AS VARCHAR(100)
----NAME----
SET @RANDID=RAND()*564
SELECT TOP 1 @NAME=NAME_,@GENDER=GENDER FROM NAMES WHERE ID=@RANDID
---SURNAME--
SET @RANDID=RAND()*7340
SELECT TOP 1 @SURNAME=SURNAME FROM SURNAMES WHERE ID=@RANDID
---BIRTHDATE---
SET @BIRTHDATE= DATEADD(DAY,RAND()*365*50, '1990-01-01')
---EMAIL----
DECLARE @RAND AS FLOAT
SET @RAND=RAND()*100
IF @RAND BETWEEN 0 AND 19
SET @EMAIL='@fakehotmail.com'
IF @RAND BETWEEN 20 AND 39
SET @EMAIL='@fakegmail.com'
IF @RAND BETWEEN 40 AND 59
SET @EMAIL='@fakeyahoo.com'
IF @RAND BETWEEN 60 AND 79
SET @EMAIL='@fakeoutlook.com'
IF @RAND BETWEEN 80 AND 89
SET @EMAIL='@fakelive.com'
IF @RAND BETWEEN 90 AND 100
SET @EMAIL='@fakeyahoo.com'
SET @EMAIL=Lower( Left(DBO.TurkishCharacter(@NAME),3) + '_' + DBO.TurkishCharacter(@SURNAME))+@EMAIL
SELECT @NAME AS NAME_,@SURNAME AS SURNAME,@GENDER AS GENDER,
@NAME+' '+@SURNAME AS NAMESURNAME, @BIRTHDATE AS BIRTHDATE,@EMAIL AS EMAIL

E-posta işini de hallettikten sonra sırada TC kimlik numarası var. Bu işlem için içinde 30 milyon satır TC Kimlik numarası algoritmasına göre oluşturulan rastgele kimlik numaralarının olduğu bir tablo oluşturdum. Müşteri oluştururken bu tablodan kayıt çekeceğiz.

SELECT @TCNUMBER=TCNUMBER FROM TCNUMBERS WHERE ID=1
SELECT @NAME AS NAME_,@SURNAME AS SURNAME,@GENDER AS GENDER,
@NAME+' '+@SURNAME AS NAMESURNAME, @BIRTHDATE AS BIRTHDATE,@EMAIL AS EMAIL,
@TCNUMBER AS TCNUMBER

Kimlik numaralarının bulunduğu tablo zaten rastgele bir sırada olduğu için döngü ile ID değerlerini alacağız. Yani tekrardan rastgele bir kayıt çekip 30 milyon satırda işi uzatmaya gerek yok. Ben burada örnek olması açısından ID=1 dedim.

Bu arada bu kimlik numaraları da bir algoritma ile rastgele oluşturuldu. Yani herhangi bir yerden alınma değil.

Bir sonraki adım telefon numarası. Bunun için de bir tablomuz var ve içinde farklı operatörler için oluşturulmuş 30 milyon telefon numarası var. Bu tabloda Guid alanını rastgelelik sağlaması için ekledim. Şu aşamada bizim için çok önemli değil. Yine hatırlatayım bu numaralar da tamamen rastgele olarak oluşturuldu.

Şimdi kimlik numarası ile aynı mantıkta ilerleyip telefon numarası seçelim.

--TELNR---
SELECT @TELNR=TELNR FROM TELNUMBERS WHERE ID=1
SELECT @NAME AS NAME_,@SURNAME AS SURNAME,@GENDER AS GENDER,
@NAME+' '+@SURNAME AS NAMESURNAME, @BIRTHDATE AS BIRTHDATE,@EMAIL AS EMAIL,
@TCNUMBER AS TCNUMBER,@TELNR AS TELNR

Sırada adres bilgilerimiz var. İl, ilçe, mahalle, sokak, posta kodu ve açık adres. Yine bunun verisi de hazır. Sokak detayına kadar içinde bu bilgilerin yer aldığı bir tablom bulunuyor ve 856 682 satır.

Bazı mahallelerin posta kodunu eşleştiremedim ama onun dışında gayet güzel bir veri seti.

Yeni değişkenlerimizi tanımlıyoruz.

DECLARE @CITY AS varchar(50)
DECLARE @TOWN AS varchar(50)
DECLARE @DISTRICT AS varchar(50)
DECLARE @STREET AS varchar(50)
DECLARE @POSTALCODE AS varchar(50)
DECLARE @ADDRESSTEXT AS varchar(500)

Şimdi bunlara değer atayalım.

--ADDRESS--
SET @RANDID=RAND()*856682
SELECT  TOP 1   @TOWN=TOWN,@DISTRICT=DISTRICT,@STREET= STREETNAME, @POSTALCODE=POSTALCODE, @ADDRESSTEXT= ADDRESSTEXT
FROM STREETS
WHERE ID= @RANDID
SELECT @NAME AS NAME_,@SURNAME AS SURNAME,@GENDER AS GENDER,
@NAME+' '+@SURNAME AS NAMESURNAME, @BIRTHDATE AS BIRTHDATE,@EMAIL AS EMAIL,
@TCNUMBER AS TCNUMBER,@TELNR AS TELNR,
@TOWN AS TOWN,@DISTRICT AS DISTRICT,@STREET AS STREETNAME,@POSTALCODE AS POSTALCODE,@ADDRESSTEXT AS ADDRESSTEXT

Adres bilgisini de bu şekilde alabildik. Ancak olayın gerçekçi olması adına buradaki rastgeleliğe müdahele etmemiz gerekiyor. Zira gerçeğe yakın bir müşteri verisi oluşturacaksak illerdeki nüfus oranına göre bir dağılım yapmamız gerekiyor. Bunun için bir tablo oluşturdum ve nüfus oranına göre bir dağılım yaptım. Ayrıca her bir şehirdeki sokakların başlangıç ve bitiş ID'lerini de bir tabloda tuttum ki bu sayede çok performanslı şekilde veri çekebileyim. Rastgele adres çekme işini ise aşağıdaki gibi gerçekleştirdim.

0 ile 100 arasında çektiğim rastgele bir değer eğer:

  • 0 - 18.49 arasında ise şehir İstanbul
  • 18.49 - 25.26 arasında ise Ankara
  • 25.26 - 30.52 arasında ise İzmir
  • ….
  • 45.2 - 47.71 arasında ise Gaziantep olarak belirlendi.

Böylece İstanbul’dan bir müşterinin oluşma olasılığı Gaziantep’te oluşmasından neredeyse dokuz kat daha fazla olmuş oldu.

Ayrıca Street tablosu default olarak İl, İlçe, Mahalle sırasına göre kayıtlı. Yani otomatik artan ID alanım da bu sıraya göre hazırlanmış durumda.

Bu nedenle her bir şehir için başlangıç ve bitiş ID'lerini de bir tabloda tutabilmiştim. Böylesi bir detaya ne gerek var diyebilirsiniz belki. Ama inanın standart ORDER BY NEWID() ile gerçekleştirilen random işleme göre yaklaşık bin kat daha hızlı çalışıyor. Böylece hızlı bir şekilde 20 milyon satır oluşturabiliyoruz.

SELECT  @CITY=CITYNAME
FROM CITYPOPULATION WHERE @RAND BETWEEN MINLIMIT AND MAXLIMIT
DECLARE @MINID INT
DECLARE @MAXID INT
SELECT @MINID=MINID,@MAXID=MAXID FROM STREETCOUNT WHERE CITY=@CITY
SET @RANDID=RAND()*(@MAXID-@MINID)
SELECT  TOP 1   @TOWN=TOWN,@DISTRICT= DISTRICT,@STREET=STREETNAME,@POSTALCODE= POSTALCODE,@ADDRESSTEXT= ADDRESSTEXT
FROM STREETS
WHERE ID= @RANDID+@MINID

Artık tüm değişkenlerimiz oluştuğuna göre içeriye insert etme işlemi kaldı.

INSERT INTO CUSTOMERS ( [NAME_], [SURNAME], [NAMESURNAME], [GENDER], [BIRTHDATE], [EMAIL], [TCNUMBER], [TELNR], [CITY], [TOWN], [DISTRICT], [STREET], [POSTALCODE], [ADDRESSTEXT])
VALUES
( @NAME, @SURNAME, @NAMESURNAME, @GENDER, @BIRTHDATE, @EMAIL, @TCNUMBER, @TELNR, @CITY, @TOWN, @DISTRICT, @STREET, @POSTALCODE, @ADDRESSTEXT)
SET @I=@I+1
END

Tüm adımlar tamam. Sırada bu işlemleri tek parçada yazmak kaldı.

--TABLOYU TEMİZLİYORUZ
TRUNCATE TABLE CUSTOMERS
DECLARE @I AS INT=1
--1 MİLYON SATIR İÇİN ÇALIŞTIRIYORUZ.
WHILE @I<=1000000
BEGIN
--DEĞİŞKEN TANIMLARI
DECLARE @NAME AS varchar(50)
DECLARE @SURNAME AS varchar(50)
DECLARE @NAMESURNAME AS varchar(100)
DECLARE @GENDER AS char(1)
DECLARE @BIRTHDATE AS DATE
DECLARE @EMAIL AS varchar(50)
DECLARE @TCNUMBER AS char(11)
DECLARE @TELNR AS varchar(15)
DECLARE @CITY AS varchar(50)
DECLARE @TOWN AS varchar(50)
DECLARE @DISTRICT AS varchar(50)
DECLARE @STREET AS varchar(50)
DECLARE @POSTALCODE AS varchar(50)
DECLARE @ADDRESSTEXT AS varchar(500)
DECLARE @RANDID AS INT
--NAME ALANI İÇİN RASTGELE ID OLUŞTURUYORUZ.
SET @RANDID=RAND()*564
SELECT @NAME=NAME_,@GENDER=GENDER FROM NAMES WHERE ID=@RANDID
20% İHTİMALLE İKİNCİ İSMİ OLMA OLASILIĞINA GÖRE İKİNCİ İSİM OLUŞTURUYORUZ
SET @RANDID=RAND()*10
IF @RANDID<3>
BEGIN
SELECT TOP 1 @NAME=@NAME+' '+NAME_ FROM NAMES WHERE GENDER=@GENDER ORDER BY NEWID()
END

--SURNAME ALANI İÇİN RASTGELE ID OLUŞTURUYORUZ
SET @RANDID=RAND()*7340
SELECT @SURNAME=SURNAME FROM SURNAMES WHERE ID=@RANDID
--NAMESURNAME ALANINI NAME VE SURNAME ALANLARINI BİRLEŞTİREREK ÇEKİYORUZ
SET @NAMESURNAME=@NAME+' '+@SURNAME
--EMAIL İÇİN İSİMİN İLK 3 HARFİ VE SOYİSİM BİLGİSİNİ ALIYORUZ.
set @EMAIL=LOWER (dbo.TurkishCharacter(Left(@NAME,3) + '_' + @SURNAME)+@EMAIL)
--RASTGELE BİR MAIL SAĞLAYICI SEÇİYORUZ
DECLARE @RAND AS FLOAT
SET @RAND=RAND()*100
IF @RAND BETWEEN 0 AND 19
SET @EMAIL=@EMAIL+'@fakehotmail.com'
IF @RAND BETWEEN 20 AND 39
SET @EMAIL=@EMAIL+'@fakegmail.com'
IF @RAND BETWEEN 40 AND 59
SET @EMAIL=@EMAIL+'@fakeyahoo.com'
IF @RAND BETWEEN 60 AND 79
SET @EMAIL=@EMAIL+'@fakeoutlook.com'
IF @RAND BETWEEN 80 AND 89
SET @EMAIL=@EMAIL+'@fakelive.com'
IF @RAND BETWEEN 90 AND 100
SET @EMAIL=@EMAIL+'@fakeyahoo.com'
--DOĞUM GÜNÜ İÇİN 01.01.1950 VE 01.01.2000 YILLARI ARASINDA RASTGELE BİR GÜN SEÇİYORUZ.
SET @BIRTHDATE=DATEADD(DAY,(365*50*RAND()),'19500101')
SELECT @TELNR=TELNR FROM TELNUMBERS  WHERE ID=@I
SELECT @TCNUMBER=TCNUMBER FROM TCNUMBERS WHERE ID=@I
--ADRES İÇİN HANGİ ŞEHİRDEN OLACAĞINI NÜFUS İLE DOĞRU ORANTILI OLARAK RASTGELE ÇEKİYORUZ
SELECT  @CITY=CITYNAME
FROM CITYPOPULATION WHERE @RAND BETWEEN MINLIMIT AND MAXLIMIT
--BULUNAN ŞEHRİN STREETS TABLOSUNDA BAŞLANGIÇ VE BİTİŞ ID DEĞERLERİNİ BULUYORUZ.
DECLARE @MINID INT
DECLARE @MAXID INT
SELECT @MINID=MINID,@MAXID=MAXID FROM STREETCOUNT WHERE CITY=@CITY
--BULDUĞUMUZ BAĞLANGIÇ VE BİTİŞ ID LERİ ARASINDA RASTGELE BİR ID SEÇİYORUZ.
SET @RANDID=RAND()*(@MAXID-@MINID)
--RASTGELE BULDUĞUMUZ ID DEN İLÇE,MAHALLE,SOKAK,POSTA KODU VE AÇIK ADRES ALANLARINI ALIYORUZ.
SELECT  TOP 1   @TOWN=TOWN, @DISTRICT=DISTRICT, @STREET= STREETNAME, @POSTALCODE = POSTALCODE, @ADDRESSTEXT=ADDRESSTEXT
FROM STREETS
WHERE ID= @RANDID+@MINID
--
INSERT INTO CUSTOMERS
( NAME_, SURNAME, NAMESURNAME, GENDER, BIRTHDATE, EMAIL, TCNUMBER, TELNR, CITY, TOWN, DISTRICT, STREET, POSTALCODE, ADDRESSTEXT)
VALUES
(@NAME, @SURNAME, @NAMESURNAME, @GENDER, @BIRTHDATE, @EMAIL, @TCNUMBER, @TELNR, @CITY, @TOWN, @DISTRICT, @STREET, @POSTALCODE, @ADDRESSTEXT)
SET @I=@I+1
END

Buradaki kod bloğunda 1 milyon satır için müşteri oluşturuyor. Bu işlem benim bilgisayarımda 4 dakika 39 saniye sürdü ve gördüğünüz gibi gerçekten de 1 milyon satırlık müşteri listemiz oluşmuş oldu.

Bu hesapla 20 milyon satırlık bir tablonun hazırlanmasının yaklaşık 80 dakika süreceğini varsayabilirsiniz. Ancak ben bunun için bir stored procedure oluşturdum ve içine aldığı parametreler ile eş zamanlı 10 sessionda ikişer milyon kayıt oluşturacağım.

Nihayetinde 20 milyon satırlık müşteri kaydımız oluştu. İşlem yaklaşık 19 dakikada tamamlandı. Paralel olarak 10 oturumda gerçekleştirmiştik. Bu kadar rastgeleliği sağlayan bir yapıda 20 milyon tekil müşteri için oldukça iyi bir süre.

Gelin birkaç istatistiğe beraber bakalım.

Şehirlere göre müşteri sayısı… Sayılar tutarlı görünüyor.

Cinsiyete göre müşteri sayısı… Kadınlar az farkla önde görünüyor.

Telefon operatörüne göre müşteri sayısında ise durum şu şekilde:

Yaşa göre müşteri sayısı ise şöyle:

Tüm bu sayılar gayet tutarlı görünüyor. Belirli bir rastgelelik dahilinde gerçek verilerden yararlanarak 20 milyon satırlık bir müşteri veri setini T-SQL yardımıyla hazırlamayı başarıyla tamamladık!

 

T-SQL hakkında daha geniş kapsamlı bilgiye erişmek, kariyerinizde bilginizle fark yaratmak isterseniz Miuul'un sunduğu T-SQL ile Veritabanı Programlama eğitimine göz atabilirsiniz.

Miuul topluluğunun bir parçası ol!

Abone ol butonuna tıklayarak Miuul'dan pazarlama ve haber içerikleri almayı onaylıyorum.