使用多个LIKE和使用List的LINQ to Sql性能

时间:2013-11-01 22:11:10

标签: c# performance linq-to-sql

我有一个MVC自动填充功能,可以搜索输入到文本框中的任意数量的字符串来查找地址。

例如,如果他们进入John Doe New York,我的查询将对customer表中的所有列(first,last,address,city,state,zip)执行LIKE,以查看它是否与该术语匹配。然后将移动到下一个搜索词并执行相同操作。

我的问题是,针对每个字段的每个搜索字词执行LIKE是否最好4次(在此示例中),或者最好返回大约10,000行并在内存中搜索它们作为列表?

第一个需要更多的数据库I / O,因为它搜索表格,但第二个需要更多的数据进入应用程序。

Customers表中的所有数据均未编入索引的全文搜索,并且最多只会在各列上显示SQL索引。

1 个答案:

答案 0 :(得分:3)

一般部分

让DB完成工作更好

如果您使用4种查询方法,您将拥有:

  1. 每个查询的时间,让1个单词的每一行进行6次比较,6 * 4比较,我们称之为24 * q1(q1 - 平均行数)
  2. 传输4个结果的时间,让它为q2 * 4(q2 - 平均滤波行数)
  3. 在客户端合并/过滤结果的时间,实际上几乎与每行的p1 - 24比较相同,再次24 * q2
  4. 如果你采用完全数据库方法,你将拥有

    1. 一次查询的时间,4个字的6次比较=每行24次比较
    2. 传输一个结果的时间q2_filtered(q2_filtered< q2)
    3. 24*q1 + q2*4 + 24*q2 > 24*q1 + q2_filtered所以答案很明显 - 数据库应该过滤记录

      如果你想将整个客户表存储在内存中 - 当然执行你自己的搜索会更快24 * q1,所以你只能摆脱传输部分,但它将消耗web服务器内存你将遇到内存/数据库

      之间的同步问题

      一些细节

      取决于您如何使用 - 您可能会遇到非常不同的性能问题,例如like 'ABC%'将使用索引,但like '%ABC%'无法使用索引

      这里有一些技巧,比如这一个:将所有列连接成1,对其中的符号进行排序并删除重复项,将符号存储在不同的列中,对于单词也是一样的 - 这将有所帮助,因为它可以使用索引,但你会有一些误报比赛

      如果你真的需要快速获取数据 - 使用全文索引或特殊方法解决这个非常庞大的全局问题