2011-06-22 75 views
1

我正在設計一個使用.NET和Windows Forms的C#程序。有一點我需要打開一個包含DataGridView對象和TextBox的表單。 DataGridView對象將被提供給TextBox上的輸入並顯示來自數據庫的實時匹配。在SELECT命令的左側使用SQL函數是否高效?

要做到這一點,我已經用下面的簡單的SQL查詢過:

SqlCommand cmd = "SELECT name,document_no FROM clients WHERE LEFT(name, " + textboxname.Text.Len + ") = '" textboxname.Text + "'"; 

它適用於現在,而我的數據庫包含約行一打,但是其高效的大型(2k +條目)數據庫?

+5

此外,不要不要忘記清理你的'textboxname.Text'以避免這種情況:http://xkcd.com/327/ – btown

+0

過去兩週我見過更多的小博比。它永遠不會變老:) – MatBailie

回答

1

您採取的方法將不會有效 - 至少,如果名稱列上有索引(如果沒有這樣的索引,那麼預計不管您做什麼性能都很差),則不是這樣。通常情況下,在WHERE子句中調用的任何函數(其中一個或多個參數是列)都將打敗查詢優化器在這些列上使用索引的任何嘗試。

好多是:

SELECT name,document_no FROM clients WHERE name LIKE 'yourtextboxtexthere%' 

...這將有使用上的名稱索引的一個很好的機會。

+0

不完全正確。有些查詢會混淆優化引擎中某些數據的屬性,有些則不會。這個特點產生了術語SARGable(搜索參數 - 能夠),許多但不是所有的功能確實是SARGable。在這種情況下(在SQL Server上)使用LEFT()或LIKE'xxx%'應該執行相同的操作。 – MatBailie

+0

@Dems - 我剛剛嘗試了LEFT方法和LIKE方法,而且LEFT並沒有被SQL Server特別對待(無可否認,2008 Express是因爲我的惡夢2008 R2實例此刻不玩球!)。左 - >索引掃描,LIKE - >索引查找。 –

1

2k +條目,是的,你可能沒問題。 2M +條目,我會說你不好。 LEFT函數可能不會使用索引。考慮改用"WHERE name LIKE " + txtboxname.Text + "%"

需要考慮的問題。

  1. SQL注入,您應該 消毒txtboxname.Text或使用 參數化查詢。
  2. 指標只要 「%」通常使用與LIKE語句是在開始時或 結束的發言,並不能同時(ALA 「%sometext%」)
+1

@Al W:我不認爲'LIKE'%sometext''會使用索引。 –

+0

實際上,LEFT()可以使用索引,因爲在應用LEFT()之前或之後,所有記錄仍將以相同的順序排列。在應用RIGHT()之後,記錄將以完全不同的順序存在。因此,OPs查詢在我看來絕對沒問題。 – MatBailie

+0

因此,SQL Server可以優化'LIKE'sometext%'',但不能優化'LIKE'%sometext''(正如ypercube指出的那樣,與第2點的矛盾部分) – MatBailie

相關問題