sql sorgu hızı değiştirirmi

MS SQL Server veritabanı ve SQL komutlarıyla ilgli sorularınızı sorabilirsiniz. Delphi tarafındaki sorularınızı lütfen Programlama forumunda sorunuz.
Cevapla
Kullanıcı avatarı
metemete
Üye
Mesajlar: 422
Kayıt: 21 Mar 2004 12:30
Konum: samsun
İletişim:

sql sorgu hızı değiştirirmi

Mesaj gönderen metemete » 21 Nis 2011 12:27

Kod: Tümünü seç

uye tablo  uyeunvan varchar(50) ,uyeadres varchar(50),uye_not text          toplam 3 kolon

1.sorgu :select uyeunvan,uyeadres from uye

aynı tablo baska olusturum fakar uye_not text i baska uyedetay a ekleyerek text kolonu tabladan sılmıs oldum

Kod: Tümünü seç

uye2 tablo  uyeunvan varchar(50) ,uyeadres varchar(50)        toplam 2 kolon

2.sorgu :select uyeunvan,uyeadres from uye2


ikisindede aynı sayıda milyonlarca kayıt oldugunu düşünürsek 1. sorgu ile 2.sorgu arasında performans farkı olurmu

Kullanıcı avatarı
conari
Üye
Mesajlar: 2102
Kayıt: 27 Nis 2006 02:10
Konum: İstanbul & Gebze Karışık

Re: sql sorgu hızı değiştirirmi

Mesaj gönderen conari » 22 Nis 2011 07:33

kayıt sayısı az olsa etkilemez o kadar. milyon derseniz illaki farkedecektir.
Bir kelimenin anlamını öğretsen bile yeter..
ResimResim

mertdogan
Üye
Mesajlar: 6
Kayıt: 07 Ara 2010 06:57

Re: sql sorgu hızı değiştirirmi

Mesaj gönderen mertdogan » 24 Nis 2011 03:20

Sorunu evet bence etkiler, hayır bence etkilemez şeklinde değil de nedenleriyle birlikte daha teknik yanıtlamak istiyorum.

Bu sorunun yanıtı; tabloda yapılan optimizasyon çalışmasına göre değişir.

Eğer tabloda index oluşturulmamışsa bu durumda veritabanı motoru senin kayıtlarını ararken tüm veritabanını gezeceği için ve de veritabanı dosya boyutun da bu text alanının içerdiği verilerden dolayı 2. duruma göre daha büyük olduğu için 1. dorgu 2. sorguya göre daha yavaş çalışır, ancak; eğer ki index'ler doğru şekilde oluşturulmuşlarsa bu durumda sql senin her bir kaydının veritabanındaki yerini "bildiği" için aralarında "teorik olarak" fark olmayacaktır.

Bu sorgunu hızlandıracak çok hayati bir geliştirmeden de bahsetmek istiyorum. Mecbur olmadıkça varchar tipi yerine nvarchar tipini kullan çünkü varchar tipinde alanın boyutu kadar yer tabloda saklanır ve sorgu sonuçlarında bu boşluk karakterleri de geri döner. Sen dönmesini istemezsen trim fonksiyonu ile bu alanı çağırabilirsin ancak bu sefer de gereksiz yere bir fonksiyon işlem yaptığı için sorgu yine yavaşlar. Bunun yerine nvarchar veri tipini kullanırsan hem boşluklar veritabanına yazılmadığı ve kayıtları geri çağırırken bu boşluklar da gelmek zorunda olmayacağı için hem de bu boşlukları göstermemek için bir fonksiyon tetiklenmeyeceği için sorgu hızında yine belirgin bir artış olacaktır.

Sorgunun performans sonuçlarını Execution Plan ile inceleyerek arada ne kadar fark olduğuna bakabilirsin.

anemos
Üye
Mesajlar: 107
Kayıt: 02 Nis 2007 06:51
Konum: Sakarya / Hendek

Re: sql sorgu hızı değiştirirmi

Mesaj gönderen anemos » 24 Nis 2011 05:14

Merhaba,

Bir alan fazla olması farkıyla tüm kayıtların aynı olduğu varsayımıyla,

"select * from tablo" gibi sorgu kullanılmayacağı için aynı alanlar ve aynı veriler dönecektir.

Neden performans farkı olsun ki?

Kullanıcı avatarı
metemete
Üye
Mesajlar: 422
Kayıt: 21 Mar 2004 12:30
Konum: samsun
İletişim:

Re: sql sorgu hızı değiştirirmi

Mesaj gönderen metemete » 26 Nis 2011 01:29

ilginize tşk ediyorum.
o zaman listelemede gostermeden ziyade kaydın detayına girince gorulecek detay text gibi bilgileri farklı bir tabloda tutmak
yahutta primary indexi yapmak grekıyo sanırım.. ama yinede birkac formdan daha arastırayım

nvarchar konusunda tam tersi diye bılıyorum ayrıca coklu dıl destgı ıcın nvarchar kullanılır dıye bılıyorum
‘VAR’ ifadesi de, tutulan metnin sonundaki boşlukları silmek içindir. Yani datayı tanımlarken parantez içerisinde verdiğimiz boyutu indirgememize yarar. Hemen minik bir örnek üzerinde inceleyelim. ‘DENEME’ ifadesini bu 4 tip ile tuttuğumuzu düşünelim.

CHAR(10) => Data, ‘DENEME ‘ şeklinde tutulur ve 10 byte yer kaplar.

NCHAR(10) => Data, ‘DENEME ‘ şeklinde tutulur ve 20 byte yer kaplar.

VARCHAR(10) => Data ‘DENEME’ şeklinde tutulur ve 6 byte yer kaplar. (datamız 6 karakterden oluşuyor. VAR yazdığımızdan dolayı geriye kalan 4 karakter CHAR tipindeki gibi boşlukla tamamlanmak yerine, görmezden geliniyor. Bu sayede datamız gereğinden fazla yer kaplamamış olur.)

NVARCHAR(10) => Data ‘DENEME’ şeklinde tutulur ve 12 byte yer kaplar.

Cevapla