Производительность Linq To SQL на IndexOf - PullRequest
0 голосов
/ 23 января 2019

Мы используем LINQ для фильтрации таблицы SQL, чтобы найти записи, в которых данные в столбце начинаются с любой подстроки, найденной в другой таблице (таблица поиска с длинным списком префиксов).

Мы попыталисьНачинается с решения в этой ссылке , но работает только в EF.

Но этот пост дал правильное решение для LinqToSQL.

Проблема в том, что это очень медленно на больших столах.Наша таблица с фамилиями содержит миллион записей, а таблица поиска - около 50 000.

Вот пример нашего текущего кода.Как мы можем увеличить производительность?

(все части сравнений уже имеют индексы)

var lookupList = LookupTable.Select(p => p.Prefix);
var q = from p in dc.Personnel
        where lookupList.Any(x => p.Surname.ToUpper().IndexOf(x) >= 0)
        select new 
        {
            Surname = p.Surname
        };

1 Ответ

0 голосов
/ 23 января 2019

Проблема в том, что он очень медленный на больших таблицах

Проблема в том, что тот, кто спроектировал, не знал основ SQL.

IndexOf - или что-то, чтоне начинается в начале строки - убивает sargeability.Период.Это означает, что любой индекс не будет использоваться.Это означает, что в основном вы выполняете сканирование таблицы и на каждом столе должны проходить через символы и сравнивать их до ... ну.А ToUpper делает или не может на самом деле делать что-либо - сравнение полей определяется на уровне SQL по индексу сопоставления, и если это не «принимать во внимание верхний / нижний значения», у вас просто нет операции на руке.

То, что вы МОЖЕТЕ сделать, это:

  • Выполните те на отдельном соединении, которое использует более низкую гарантию транзакции (Readcommitted), чтобы не оставлять блокировки на столе.Стандартное соединение сериализуемо, ПОЛНОСТЬЮ не подходит для справочных таблиц.
    • Вы можете захотеть скрыть таблицу и использовать индекс, который перенаправляет таблицу с использованием readcommmitted для этого.
  • Или загрузить их в память ОДИН РАЗ, а затем запустить ее параллельнов памяти, зависит от того, является ли это серверным кодом.

В конце концов, поиск IN-строк ЧРЕЗВЫЧАЙНО трудоемок, и вы ОЧЕНЬ мало можете сделать, и SQL, как правило, не оптимизирован для этого.Это не проблема EF и не Linq2SQL - в значительной степени, поскольку ваши водительские права не определяют, что ваш автомобиль не является самолетом.SQL обычно не обрабатывает этот тип запросов прилично.

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