2015-09-22 3 views
0

Я запрашиваю базу данных sql, которая находится в Azure (на самом деле мое веб-приложение также работает на Azure).Запрос LINQ для базы данных базы данных Azure SQL

Каждый раз, когда я выполняю этот конкретный запрос, происходят постоянно изменяющиеся ошибки (например, иногда происходит тайм-аут, иногда он отлично работает, иногда требуется очень много времени для загрузки).

Я заметил, что я использую метод ToList здесь для перечисления запроса, но я подозреваю, что именно поэтому он унижает.

В любом случае я могу исправить это или сделать его лучше .... или просто использовать собственный SQL для выполнения моего запроса?.

Я также должен отметить, что мой веб-интерфейс для моего подключения к базе данных установлен в 30 секунд. Будет ли это иметь какое-либо преимущество в производительности?

Я помещаю подозрительный код здесь:

case null:  
lstQueryEvents = db.vwTimelines.Where(s => s.UserID == UserId) 
        .Where(s => s.blnHide == false) 
        .Where(s => s.strEmailAddress.Contains(strSearch) || s.strDisplayName.Contains(strSearch) || s.strSubject.Contains(strSearch)) 
        .OrderByDescending(s => s.LatestEventTime) 
        .Take(intNumRecords) 
        .ToList(); 
        break; 

Это в основном запрашивая 50 записей ... Я не понимаю, почему это таймаут иногда.

+1

Try разжиться заявление SQL, который запускается на выполнение и запустить его, хотя в SQL Profiler. Я подозреваю, что '.Contains()' call force table scans, поэтому срок выполнения запроса. –

ответ

1

Вот несколько советов:

Убедитесь, что типы данных SQL соответствуют типам в модели

Судя по вашему коду, типы должны быть что-то вроде этого:

  • UserID должен быть int (не могу точно сказать, просмотрев код);
  • blnHide должно быть bit;
  • strEmailAddress должно быть nvarchar;
  • strDisplayName должно быть nvarchar;
  • strSubject должно быть nvarchar;

Сделать использование индексов

Вы должны создать некластерированных индексы на столбцах, которые используются для фильтрации и данные заказа.

В порядке значимости:

  • LatestEventTime как вы заказать все данные по этой колонке;
  • UserID как вы отфильтровываете большую часть данных этой колонкой;
  • blnHide как вы отфильтровываете часть данных в этой колонке;

Сделать использование индексов для текста поиска

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

Для достижения этой цели:

  • изменения .Contains() с .StartsWith(), поскольку это позволило бы индекс будет использоваться.
  • создать некластерированных Индексы strEmailAddress колонки:
  • создания некластеризованных индексов на strDisplayName колонки:
  • создания некластеризованных индексов на strSubject колонки:

Попробуйте свободный текстовый поиск

Microsoft только недавно представила полнотекстовый поиск в Azure SQL. Вы можете использовать это, чтобы найти соответствие строк частичной строкой. Это немного сложно добиться с помощью EF, но это, безусловно, выполнимо.

Вот несколько ссылок, чтобы вы начали:

Entity Framework, Code First and Full Text Search https://azure.microsoft.com/en-us/blog/full-text-search-is-now-available-for-preview-in-azure-sql-database/

+0

Я попытался добавить индексирование и, конечно же, ускорил запрос. Я также использовал '.StartsWith()', но он не достигает того, что я изначально хотел, '.Contains()'. Есть ли способ достичь той же функциональности '.Contains()'? –

+1

К сожалению, нет. В этом случае вы можете вспомнить индекс, например, о телефонной книге. Вы можете быстро найти вещи, только если вы начнете поиск по фамилии людей. Если вы хотите искать по средней части фамилии, вам придется проходить через все фамилии в книге один на один. –

0

string.Contains (...) преобразован в WHERE ... LIKE ... sql-statement. Это очень дорого. Попытайтесь изменить свой запрос, чтобы избежать его. Плюс, Azure SQL имеет свои собственные ограничения (5 секунд, насколько я помню, но лучше проверяю SLA) для запуска запроса, поэтому он обычно игнорирует ваши настройки web.config, если они длиннее.

+0

Есть ли в любом случае я могу изменить запрос, чтобы НЕ делать .Contains (т. Е. Как вы сказали, что он выполняет LIKE..что я намеревался) ... Но это странно, иногда это время от времени, иногда это не так. –

+0

Azure - это облако, поэтому ресурсы распределяются между большим количеством приложений, поэтому единственное, что гарантировано, вы получаете некоторый уровень обслуживания. Он может быть выше, когда есть запасные ресурсы, и в то время ваш запрос работает нормально. Если вы добавите структуру таблицы с индексами, возможно, мы сможем выяснить, как быстрее ее запрашивать. – unconnected

Смежные вопросы