2010-03-17 13 views
5

Not: Bu soruda, "otomatik tamamlama" terimini (veya "yinelemeli arama") kullanıyorum. Google Arama gibi size verir. Ayrıca benim soru web uygulamaları vs yağ istemci uygulamaları için spesifik değildir.Otomatik tamamlama/yinelemeli arama için sonuçlar sağlarken veritabanı performansını nasıl en iyi hale getirirsiniz?

SQL SELECT sorguları, özellikle bu isteğe bağlı büyük veri kümeleri üzerinden, bu tür sorgu için iyi bir performans sağlamak üzere normal olarak nasıl oluşturulur? Aramanın yalnızca ilk n karakterleri (en kolay durum) temelinde sorgulayacağı durumda, hala yeni SELECT sonucunu LIKE ... her tuşa basan bir LASE ... girişine vermekteyim. Çeşitli önbellekleme biçimleriyle bile, bu performansın düşük olmasına neden olabilir.

Arama dizginizin önek eşleşmeleri, alt dizgi eşleşmeleri vb. Sonuçları döndürmesini istediğiniz durumlarda, bu daha da zor bir sorundur. Kişiler listesi arama durumuna bakıldığında, FirstName + LastName, LastName + FirstName veya başka bir alt dize ile eşleşen sonuçları döndürebilirsiniz.

cevap

2

Google, Yahoo vb. Gibi aramalar, yüksek performanslı anahtar kelimeler listesi oluşturmak için tam metin dizinlerini kullanır.

Tek sözcük sütunlarında yineleyici arama yapıyorsanız, tam metin dizinlerine ve anahtar kelimelere ihtiyacınız olmayacaktır. İndeksli sütunlarda LIKE kullanabilirsiniz.

Aramaları siz yazarken yaptığınız için, yalnızca eşleşen eşleştiriyorsunuz. Dizine eklenmiş sütunlarınız, bir LIKE yan tümcesi ve "önek" araması yapan bir joker karakteriyle normal performansa sahip olur. Diğer ucundan aramak gerekiyorsa

SELECT last_name FROM users WHERE last_name LIKE 'Adam%' 

, sen neyse ki, insanlar geriye yazmayın, bir ters endeksi istiyorum, ama olacak.

Her "yinelemeli arama" için ancak bir zamanlayıcıda yeni bir SELECT ifadesi çıkarırsınız. Sadece yazmayı bıraktılarsa, başka bir sorgu verir misiniz? Sonuç kümesini LIMIT veya TOP kullanarak sınırlayacaksınız, böylece sorgu 10 kayıt dolduğunda tamamlanabilir. Ayrıca, bu şekilde tel üzerinden sadece 10 kayıt gönderiyorsunuz.

SELECT last_name FROM users WHERE last_name LIKE 'Adam%' LIMIT 10 

Elbette, en iyi performans için, last_name birincil dizin olacaktır. Bir indeks, veritabanının gerçek rekoru kırmadan değeri almasını sağlar. Birincil indeksler genellikle bitişiktir, bu da onları daha da hızlı hale getirir.

Şans eseri, bir sütun üzerinde arama yapıyorsunuz, ancak bir başkasını döndürüyorsanız, bir veritabanı dizini kullanın, böylece veritabanı motoru, kaydı kaydetmeden dizinin kendisinden gelen değeri alabilir.

SELECT first_name FROM users WHERE last_name LIKE 'Adam%' LIMIT 10 

Yukarıdaki sorgu için, birincil dizin (last_name, first_name) olacaktır.

Zamanlayıcı, performansın anahtarıdır. İstediğiniz performansı almak için zamanlayıcıyı ayarlayabilirsin.

+0

@Marcus - Bu cevap müthiş, teşekkür ederim! – Howiecamp

0

Buna, denemek için Sql sorgusuyla bunu elde etmek için "siz yazarken aratın" denir.

select Emp_ID,Emp_Name,Father_Name,Email from Employee where Emp_Name like '" + textBox1.Text + "%' ORDER BY Emp_Name ASC 

Şimdi bu kimse (sizin SQL veritabanına bir arayüz olarak hizmet veren) C# formlar bu uygulamaya isterse daha genel cevaptır.Şimdi textBox1'de yazdığınız her şey, formunuzdaki dataGridView'de sonuçları görüntüler. Bu kodu 'Siz yazarken ara' uygulamasına erişmek için textBox1_TextChanged olayına eklemeniz gerekir. Umarım amacınız bana yardımcı olur ...

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
string query = "select Emp_ID,Emp_Name,Father_Name,Email from Employee where Emp_Name like '" + textBox1.Text + "%' ORDER BY Emp_Name ASC"; 
using (SqlCommand comand = new SqlCommand(query, con)) 
{ 
SqlDataAdapter da = new SqlDataAdapter(); 
da.SelectCommand = comand; 
DataTable ds = new DataTable(); 
ds.Locale = System.Globalization.CultureInfo.InvariantCulture; 
da.Fill(ds); 
dataGridView1.DataSource = ds; 
} 
} 
+0

'textBox1.text' dosyasındaki değer, SQL'de kullanılmadan önce düzgün bir şekilde atlanmalıdır. Örneğin, 'textBox1.text' 'bir hataya neden oluyorsa '' ne olacak? – VCD

İlgili konular