2011-06-22 40 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

相关问题