Лучший метод для поиска подходящих подстрок с Linq & SQL Server - PullRequest
2 голосов
/ 02 февраля 2010

У меня есть требование найти строки в таблице, содержащей 200 000 записей. Некоторые могут не считать это «большим», но оно достаточно велико, чтобы оправдать соображения производительности.

Таблица содержит строки, состоящие только из цифр. Например, пользователь может ввести что-то вроде «12340-0560-78» или его части, например, '0560', и мне нужно сопоставить значения

12345678 и 123405678 и 0123456780 и т. Д.

Это НЦД, национальные коды лекарств и, несмотря на стандарт, производители форматируют их различными способами, добавляя или опуская нули в различных позициях в своих штрих-кодах.

Я начал с того, что позволил Linq выполнить работу, удалив нули и нечисловые символы из строки поиска и используя Contains () в столбце после удаления из него всех нулей. Это слишком медленно.

Итак, я добавил вычисляемый столбец в таблицу, содержащий столбец поиска минус все нули. Это лучше, но я все еще делаю сканирование таблицы из-за Contains ().

Затем я создал полнотекстовый индекс, но понял, что с полнотекстовым индексом я не могу искать подстроки, только слова, фразы и префиксы. Странно, но это не решает эту проблему.

Есть ли другие варианты?

Ответы [ 2 ]

1 голос
/ 03 февраля 2010

Как насчет создания простого кластеризованного индекса для вычисляемого столбца. Тогда все в порядке?

, например

CREATE TABLE [dbo].[foo](
    [code] [varchar](20) NULL,
    [ccol]  AS (replace(replace([code],'-',''),' ','')
) ON [PRIMARY]

и

CREATE CLUSTERED INDEX [IX_foo] ON [dbo].[foo] 
(
    [ccol] ASC
)
...
0 голосов
/ 13 февраля 2011

Я бы все-таки попробовал полнотекстовый индекс, но вы должны подготовить текст для индексации определенным образом.

Идея состоит в том, чтобы создать отдельный столбец ndc_suffixes и заполнить его всемисуффиксы ndc.То есть для ndc = '1234567890' ndc_suffixes будет '1234567890 234567890 34567890 ... 890 90 0'.Это может быть вычисляемый постоянный столбец .Поскольку NDC имеют длину около 10 цифр, ndc_suffixes займет разумное количество памяти (и в любом случае его можно перенести в отдельную таблицу).

Затем поиск полнотекстового префикса более ndc_suffixes может быть использовано для поиска совпадений подстроки.Также, вероятно, потребуется дополнительная проверка ndc like '%560%', чтобы отфильтровать поддельные совпадения, но эта проверка будет выполняться по значительно сокращенному набору строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...