Быстрое сопоставление входной строки со строками в БД - PullRequest
0 голосов
/ 22 декабря 2018

Имеется алгоритм сопоставления строк, который работает с определенными строками (например, «123456789») и шаблонами строк (например, «1 ******* 9»).Строковые шаблоны не являются какими-либо шаблонами регулярных выражений или SQL LIKE - они предоставляют только заполнитель "*", что означает "одну цифру или букву".

Таким образом, алгоритм будет обрабатывать эти значения как "равные":

12ABCDE89
12A***E89
**A****8*
*********

Данные хранятся в реляционной базе данных (MS SQL Server), и приложение ядра .net обращается к ним через EntityFramework Core.Требуемый сценарий состоит в том, чтобы получить 500 входных строк (определенных или шаблонных) и найти совпадающие строки в базе данных (в таблице, содержащей 1 миллион строк).

Сначала я реализовал ее, используя сопоставление с шаблоном LIKE (сначала я преобразовал входные строки в шаблон LIKE, а затем создал предикат для предложения WHERE), но тесты показали, что он имеет недопустимую производительность.

Могу ли я реализовать эту задачу с помощью функции FULL-TEXT SEARCH в MSSQL?Как будет выглядеть предикат в этом случае?Есть еще идеи по реализации?

1 Ответ

0 голосов
/ 22 декабря 2018

Вы можете попробовать подход с использованием пользовательских функций CLR ( пример ).Но вам не нужно использовать SQL-запросы вообще.Просто сравните 2 строки, используя ваш алгоритм.Такой подход теоретически должен быть быстрее

  [SqlFunction(
      DataAccess = DataAccessKind.None,
      SystemDataAccess = SystemDataAccessKind.None,
      IsPrecise = true,
      IsDeterministic = true)
  ]

  // Have to be public and static
  public static bool CustomIsEqualTo(string baseString, string stringToCompare)
  {
      return true;   
  }
...