2013-11-01 88 views
0

我有一個MVC自動完成功能,它將搜索輸入到文本框中的任意數量的字符串以查找地址。使用多個LIKE vs使用列表的LINQ to Sql性能

例如,如果他們輸入John Doe紐約,我的查詢將對客戶表中的所有列(第一個,最後一個,地址,城市,州,郵編)進行LIKE查看它是否與該術語匹配。然後移動到下一個搜索詞並執行相同操作。

我的問題是,對於每個字段的每個搜索項,對於每個搜索項都執行LIKE操作4次(或者最好是返回大約10000行並在內存中搜索它們)一個列表?

第一個需要更多的數據庫I/O,因爲它搜索表,但第二個需要更多的數據進入應用程序。

「客戶」表中的數據都不是全文搜索索引,並且最好在各個列上都有SQL索引。

+0

不要從數據庫返回10,000行到Web應用程序。該數據庫旨在處理您需要完成的IO和數據過濾。 Web服務器/應用程序不是。 – DaveDev

+0

在你的例子中,你指定「John Doe New York」相當於4分貝命中。爲什麼是這樣?決定多久調用一次數據庫的標準是什麼?幾年前我做了類似的事情,我基本上有一個計時器,它設置了每秒鐘在文本框中查詢數據庫的任何搜索詞(我認爲)。 – DaveDev

+0

它會查詢John,然後查詢Doe,然後查詢New,然後查詢York。這些中的每一個都會在數據庫中運行查詢。我試圖將整個事件作爲IQueryable來運行,但它因爲創建了太多的笛卡爾或其他東西而崩潰。 – Scottie

回答

3

通用部分

最好是有,如果你有4個查詢去的方式,你將有DB做它的工作

  1. 時間對於每個查詢,讓它成爲6比較每行1字,6 * 4比較,讓它叫做24 * q1(q1 - 平均行數)
  2. 時間發送4個結果,讓它成爲q2 * 4(q2 - 平均過濾次數行)
  3. 時間合併/過濾結果在客戶端,這實際上是幾乎相同的P1 - 24個比較,對於每一行,再次24 * Q2

,如果你有充分分貝方法去,你會有

  1. 時間一個查詢將是,4個字6個比較=每行24個比較
  2. 時間發送一個結果q2_filtered(q2_filtered < Q2)

24*q1 + q2*4 + 24*q2 > 24*q1 + q2_filtered這樣,答案是顯而易見的 - 數據庫應該篩選記錄

,如果你想存儲整個customer表在內存中 - 當然,這將是更快地執行自己的搜索,這將需要24 * Q1,所以你」再擺脫只傳動部分,但它會消耗Web服務器的內存,您將有/ DB

一些細節

內存之間的同步問題,這取決於你如何使用像 - 你可以有很不同的性能問題,例如like 'ABC%'將使用索引,但like '%ABC%'不能使用索引

這裏有可能的一些技巧,像這樣一個:所有列連接成1,在它的符號排序和刪除重複項,在不同的列中存儲符號,相同的單詞 - 這將大家有點幫助,因爲它可以使用索引,但會有一些誤報匹配

,如果你真的需要快速獲取數據 - 使用全文索引或特殊的方法來這真的是巨大的,全球性的問題