Sql server Net与SQL

Sql server Net与SQL,sql-server,performance,Sql Server,Performance,我正在开发一个asp.net应用程序,其中用户在excel工作表中输入一组文档编号,我的应用程序应该搜索数据库中的特定记录,并返回包含作为输入的值的记录 例如,如果作为输入提供的文档编号为“2245678” 在数据库中,包含该值的字段的格式为LibraryName:2245678:Version1,因为在数据库中的存储方式,我不得不将一个类似的查询作为 Select from table where documentnumber like '%2245678%' 对于作为excel工作表中的输

我正在开发一个asp.net应用程序,其中用户在excel工作表中输入一组文档编号,我的应用程序应该搜索数据库中的特定记录,并返回包含作为输入的值的记录

例如,如果作为输入提供的文档编号为“2245678”

在数据库中,包含该值的字段的格式为LibraryName:2245678:Version1,因为在数据库中的存储方式,我不得不将一个类似的查询作为

Select from table where documentnumber like '%2245678%'
对于作为excel工作表中的输入传递的所有文档编号,必须重复这组sql语句,这确实会导致性能问题


还有其他方法吗?

您没有指定数据库提供程序,但这些字段可能是您需要的


注意:如果JBKing的评论适合您的应用程序,我支持它。

您没有指定数据库提供程序,但这些字段可能是您需要的


注意:如果JBKing的评论适合您的应用程序,我支持它。

由于您无法修改模式,请查看它是否执行得更好:

Select * 
from table 
where substring (documentnumber , charindex(':', documentnumber ) + 1, charindex(':', documentnumber , charindex(':', documentnumber ) + 1) - charindex(':', documentnumber ) - 1) = '2245678'
编辑:

如果库名称的数量有限(很少),则执行硬编码查询可能会获得更好的性能:

Select * 
from table
where documentnumber like 'LibraryName1:' + '2245678' + ':%'
    or documentnumber like 'LibraryName2:' + '2245678' + ':%'
    or documentnumber like 'LibraryName3:' + '2245678' + ':%'

如果documentnumber字段实际上已编制索引,则该字段的性能应该相当好。

由于您无法修改架构,请查看该字段的性能是否更好:

Select * 
from table 
where substring (documentnumber , charindex(':', documentnumber ) + 1, charindex(':', documentnumber , charindex(':', documentnumber ) + 1) - charindex(':', documentnumber ) - 1) = '2245678'
编辑:

如果库名称的数量有限(很少),则执行硬编码查询可能会获得更好的性能:

Select * 
from table
where documentnumber like 'LibraryName1:' + '2245678' + ':%'
    or documentnumber like 'LibraryName2:' + '2245678' + ':%'
    or documentnumber like 'LibraryName3:' + '2245678' + ':%'

如果documentnumber字段实际上已编制索引,那么它的性能应该相当好。

如果它是这样存储的,那么您可以直接说出您所拥有的是什么

Field1:Field2:Field3然后可以使用子字符串和charindex,而不是like%%。我不知道它的性能是否得到了改进,但我想应该是这样的,因为在查找一个字符的索引时,头的位置比为表达式顺序扫描整个字符串的位置要少

因此,在SQLServer2005中,这是一个近似的例子

选择子字符串(子字符串('field1:field2:field3',CHARINDEX(':','field1:field2:field3')+1999),1,CHARINDEX(':'),子字符串('field1:field2:field3',CHARINDEX(':','field1:field2:field3')+1999))-1)


有一种方法:)

如果它是这样储存的,你可以把它放在心上,说你拥有的是

Field1:Field2:Field3然后可以使用子字符串和charindex,而不是like%%。我不知道它的性能是否得到了改进,但我想应该是这样的,因为在查找一个字符的索引时,头的位置比为表达式顺序扫描整个字符串的位置要少

因此,在SQLServer2005中,这是一个近似的例子

选择子字符串(子字符串('field1:field2:field3',CHARINDEX(':','field1:field2:field3')+1999),1,CHARINDEX(':'),子字符串('field1:field2:field3',CHARINDEX(':','field1:field2:field3')+1999))-1)


有一种方法:)

为什么您的数据库会有这样的字段格式?为什么不将库名和版本作为列包装在字符串中呢?数据库是由供应商设计的,我无法控制更改它们,或者使用全文搜索,或者将ID提取到单独的字段中。按照现在的方式,您将无法制定任何可以使用索引的查询-您将始终进行全表扫描以查找每个条目。。。。。不是很理想!在这种情况下,别忘了确保你的应用程序对输入进行一些验证,这样你就不会受到SQL注入攻击,因为用户可能会将查询更改为自由格式,这是我想到的另一个问题。为什么你的数据库会有这样格式的字段?为什么不将库名和版本作为列包装在字符串中呢?数据库是由供应商设计的,我无法控制更改它们,或者使用全文搜索,或者将ID提取到单独的字段中。按照现在的方式,您将无法制定任何可以使用索引的查询-您将始终进行全表扫描以查找每个条目。。。。。不是很理想!唉,在这种情况下,别忘了确保你的应用程序对输入进行一些验证,这样你就不会受到SQL注入攻击,因为用户可能会将查询更改为自由格式,这是我想到的另一个问题。可能不会-在这种情况下,你在WHERE子句上使用函数,太-所以不会使用索引可能不会-在本例中,您也在WHERE子句上使用函数-所以不会使用索引,通过对字段进行全文索引,您基本上是在预先交换资源(创建索引并保持索引)以提高查询时间性能(因为列中的所有文本都已索引)。全文索引有很多陷阱和细微差别,大多数都是为了处理使索引保持最新的压力,我远非专家。但是如果你决定走这条路,有几篇文章可以帮助你。好吧,通过全文索引字段,你基本上是为了查询时间性能(因为列中的所有文本都被索引)而预先交换资源(创建索引并保持索引)。全文索引有很多陷阱和细微差别,大多数都是为了处理使索引保持最新的压力,我远非专家。但是如果你决定走这条路,有几篇文章可以帮助你。