10-10-2019, Saat: 09:25
(Son Düzenleme: 10-10-2019, Saat: 09:42, Düzenleyen: Tuğrul HELVACI.)
(09-10-2019, Saat: 17:42)delphim Adlı Kullanıcıdan Alıntı: Bir konuda yanlış anlaşılmalar ya da hatalı varsayımlar mevcut. Length, Lengthb ya da parametresi VARCHAR olan başka fonksiyonlara 4444 gibi sayısal değerler geçtiğinizde size 4444 için değil '4444' için hesaplama yapar. Bu Oracle'ın sayısal verileri karakter olarak tutmasından değil otomatik tip değişimi yapmasından kaynaklanır.
Oracle sayısal alana kakakter, karakter alana sayısal değer atamaya izin verir. Gerekiyorsa ve mümkünse otomatik tip dönüşümünü yapar ve kodu çalıştırır. Tip dönüşümü mümkün değilse de ilgili hata mesajı ile çalışmayı sonlandırır.
Diğer konuya gelince Oracle'da çalışmıyorum. İşim gereği Oracle'da başka veritabanları da kullanıyorum. Tüm veritabanlarının benzer konulara farklı yaklaşımları, farklı ele alışları mevcut. Tüm programlama dillerinin benzer konulara farklı yaklaşımları, farklı ele alışları mevcut olduğu gibi. Bir veritabanına çok alışık olup da diğerinde olmayan yada farklı ele alınan şeyler için saçmalık demek en basitinden sığ bir yaklaşım. Hiçbirini (Oracle, DB2, MSSQL, ..., Delphi, Java, C/C++, C#, Go, ...) zorla kullanmıyoruz. Şimdi C/C++'da bolean veri türü yok ne saçma bir dil diyemyiz. Zorla kullanıyorsak da olanı olduğu şekilde kullanacağız, ya da kullanmayacağız.
Demek bizim yaklaşımımız "sığ" bir yaklaşım. Birincisi, bir veritabanına alışık olduğumuz için bir diğer veritabanını eleştirmiyoruz. Amacımız üzüm yemek, bağcı dövmek değil. Konu başında ifade edildiği gibi bir BYTE veri tutabilen bir tür arıyoruz sadece. Bütün programlama dilleri 1 BYTE yer kaplayan bir veri türüne sahipken; siz bizim Boolean veri türünden bahsettiğimizi sanmışsınız. C++'da Boolean veri türü yok diye bu dil saçmadır demeyiz; ancak C++ bir byte'ın yetebileceği bir değerler aralığı için bize "hayır sen 3 byte kullanacaksın" derse bu SAÇMA deriz.
Velhasıl, sözün özü; bir byte içinde tutulabilecek bir veri 3 byte içinde tutuluyor ise; burada bir başarıdan bahsedemeyiz. Geriye kalan 2 byte Oracle efendiye ait değil. O byte'lar benim diskimden, benim hafızamdan ve benim network band width'imden yiyecek. Kimsenin böyle bir tasarrufu olmamalı.
Kısacası; Oracle altında yatan başka bir neden yok ise; TINYINT, BYTE vs. adına ne derseniz deyin, 1 BYTE uzunluğa sığacak bir veri türünü bilerek ve isteyerek getirmedi ise; ben bu durumu aptalca bulurum. Bunu savunanları da akıllı adletmem. Oracle çok istiyorsa; sayısal verileri VARCHAR gibi tutacak NUMBER isimli bir alana sahip olabilir ve isteyen onu kullanabilir; ancak tüm programlama dillerinin sunduğu ve byte genişlikleri belli olan sabit veri türlerine de destek vermelidir. Byte(1), SmallInt(2), Word(2), Int(4), Int64(8) gibi. Bu bir opsiyon olmamalı, zaruri olmalıdır.
İsteyen Oracle kullanır, isteyen kullanmaz. Orası ayrı bir tartışma konusudur. Ancak aptalca bir şeyi kim yaparsa yapsın aptalcadır. Bunu Oracle yapınca akıllıca bir şeye dönüşmez yani bu. Bu tarz fanatizm'den bir an evvel kurtulmanız gerektiğini düşünüyorum.
O sizin bitlerle byte'larla ilgilenmenize gerek kalmaz dediğiniz Oracle; 1 byte'lık veriyi minimum 1 maximum 3 byte'ta temsil ederken (ortalamasına 2 byte diyelim); tablonuzda 75.000.000 kayıt olduğunda(ki bizim tablolarımızda daha fazlası da var); fazladan 75.000.000 BYTE diskte fazladan yer işgal edecek; kafama esip aptalca bir şey olmasına rağmen sadece o alanı tüm kayıtlar bazında select etmek istesem; hafızamda 75.000.000 BYTE'ı fazladan işgal edecek; ve fazladan bir o kadar BYTE ağımda gereksiz yere gidip gelecek.
Şimdi bu mu aptalca değil !
Not: Ayrıca belirteyim; Delphi NUMBER veri türünü FireDAC kullanıyorsanız; TBCD yapısı ile map ediyor. Dolayısı ile her bir alanın hafızada kaplayacağı alan SizeOf(TBCD) kadar olacaktır. O da 34 Byte yapar. 75.000.000 Kayıt * 34 Byte = 2.550.000.000 Byte yapar. Kaybettiğimiz alan = 2.475.000.000 Byte. Altı üstü bir BYTE'lık yer istemiştik oysaki, geldiğimiz noktaya bak.
Her zaman bir BYTE sadece bir BYTE değildir !
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...