1

У меня есть datamodel в Entity Framework CodeFirst. Эта датамодель содержит объект Контракты, в котором содержится около полумиллиона записей, присутствующих в SQL Server. Субъект Контракта связан с другими лицами, прямо косвенно.Как оценить условие на большое количество записей базы данных

У меня теперь есть работа с бэкэнд, которая должна проверять все контракты для условия, и если это условие оценивается как true, оно должно выполнить некоторые действия по контракту. Проблема в том, что условие не так просто, что его можно поместить в предложение where where. Для оценки контракта мы должны проверить состояние нескольких объектов в иерархии Контракта. Условие оценивается как true для очень небольшой доли от общего количества Контрактов в базе данных.

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

Итак, кажется, что существует 2 очень субоптимальных решения: 1) Определите идентификаторы контракта контрактов, которые удовлетворяют условию в хранимой процедуре, а затем из кода извлекают только эти контракты. Это означало бы, что мы вводим логику в нашу базу данных, которая, как представляется, сначала противоречит всей философии кода. 2) Извлеките все контракты в памяти (частично по частям, например, в образцах 500) и оцените условие в коде. Разумеется, производительность не очень хорошая.

Мой вопрос в том, какие альтернативные пути были бы решены этой проблемой?

+1

Если вы установили правила для выбора контрактов здесь, возможно, мы могли бы написать запрос linq, который вы можете использовать. –

+0

Мы не можем принять это решение за вас. И я не уверен, что вы на самом деле спрашиваете. –

ответ

1

Для данного класса ComplexClass есть соответствующие ComplexClassInfo. Класс Info содержит ключевые/важные свойства ComplexClass. Он также имеет элементы для дочерних объектов. Мы добавили достаточно свойств, чтобы дать классам Info некоторую общую полезность. И.Е. у нас нет классов Info, специально предназначенных для конкретных запросов данных.

Сделайте исходную выборку БД, которая может быть отфильтрована, для данных ComplexClassInfo. Затем повторите эту сборку ComplexClassInfo, применяя наше сложное правило. Используя результирующий набор, мы запрашиваем БД для создания экземпляров отдельных объектов ComplexClass.

+0

Вдохновленный вашим ответом, я написал запрос linq (довольно сложный, но все же управляемый), чтобы получить минимальный объем информации для каждого контракта, чтобы быть в состоянии проверить условие. Получение всех строк стоит около минуты, а остальная часть обработки намного меньше. Таким образом, весь процесс занял около 15 минут, теперь требуется всего 2 минуты. – staccata

0

Мои мысли о двух подходах заключаются в следующем:

  1. Да, сложная логика в хранимая процедура труднее поддерживать по сравнению с кодом. Но это не значит, что вы этого не делаете. Если производительность важна для вас, это то, что вы должны делать.
  2. Сколько времени вы тратите на извлечение и обработку строк 500K? Вы должны быть в состоянии оптимизировать его. Рассмотрим - a. количество столбцов, которые вы извлекаете. можете ли вы там оптимизировать? b. Какой размер наибольшего размера вы можете использовать? Можете ли вы установить размер выборки 500K? c. что вы можете оптимизировать в коде? Параметры памяти? Более быстрый алгоритм?
Смежные вопросы