Я говорю нет, партнер говорит да.Мы оба упрямые.Мы проверим, но мне нужны некоторые боеприпасы от вас, чтобы подтвердить мой случай, что приведенный ниже псевдокод не является узким местом.Мы выполняем два запроса.Первый относится к большой таблице (100 тыс. Записей), которая называется BigTable ниже.Затем мы берем то, что находим (обычно 30 или около того записей), и запускаем эти записи (в цикле, см. Второй «foreach» ниже) для таблицы намного меньшего размера, называемой SmallTable, обычно содержащей около 200 записей.Мой партнер хочет объединить записи, найденные в SmallTable, чтобы они появлялись в записях BigTable, но если вы это сделаете, вы потеряете гибкость, и базы данных перестанут иметь нормальную форму.Мой партнер говорит, что он не заботится о нормальной форме и утверждает, что приведенное ниже является узким местом.Помоги мне выиграть эту битву!Конечно, моя запасная позиция будет «давайте проверим это и посмотрим», но теперь я могу использовать огневую мощь.Мы ожидаем от 10 запросов в секунду (в этом случае, вероятно, узкое место, если оно вообще есть, тривиально) или до 1500 в секунду (что, вероятно, сломает наше приложение где-то еще! LOL. Но мы оптимисты).
Платформа: Microsoft SQL Server 2008, использующая веб-сервисы, написанные на C # и Linq-to-Entities (EF), работающие на удаленном сервере, которым мы не владеем, но которым владеет серверная компания, такая как GoDaddy, по запросу «Per Call/ без гражданства.В SQL Server все установлено по умолчанию (например, Max Pooling = 100, Timeout Balance Load = 0, Pooling = True).Я не занимаюсь кэшированием, поскольку где-то читал, что кэширование плохо работает с распределенными базами данных, которые, как мне кажется, использует эта серверная компания.
Я ценю это.Вот псевдокод:
Public string MyWebMethod()
{
List<Record> myrecords = new List<Records>();
try //try block 1
{
using (AEntityFramework context = new AEntityFramework())
{
var RecordsReturned = (from x in context.BigTable
//some conditions deleted
select x);
//do some stuff with these records, typically 30 records returned from BigTable, which has 10000 to 100000 records total
foreach (Record r in RecordsReturned)
{ myrecords.Add(r);} //add these records to the List myrecords, to be used later.
}
}
catch (Exception)
{
Try block 1 exceptions here
}
//end of try block 1
////////////////// now move to the next SQL query, which loops--is this a bottleneck?
foreach (Record R in myrecords)
{
try //try block 2
{
using (AEntityFramework context = new EntityFramework())
{
var SmallQuery = (from y in context.SmallTable
//some conditions deleted
select y);
//small table has 100 to 200 records, it is very small
//do a short operation with the Record R and anything collected by var SmallQuery, typically 2 to 3 entries.
}
}//end of try block 2
catch (Exception)
{
//try block 2 exceptions here
}
} //end of foreach
return “OK”;
}
[РЕДАКТИРОВАТЬ] в ответ на ответы, чтобы присоединиться.В случае отсутствия ответа я открою вторую ветку.Спасибо!Пожалейте новичка, пожалуйста. Ну, я боялся этого.Теперь этот вопрос трансформируется, и, возможно, я открою новую тему.
Вот мой запрос:
- Таблица ACustomers (содержит идентификаторы клиентов и почтовые индексы)
- Таблица CCategories (содержит такие категории, как «еда», «жилье», «одежда») (связывание) Таблица A_C (поскольку таблицы A и C связаны как многие-ко-многим): содержит «идентификаторы клиентов» и категории в комбинациив качестве первичных ключей
Мне нужно выбрать все записи в таблице A, которые удовлетворяют условию, а затем отфильтровать эти записи в зависимости от списка параметров, найденных в связующей таблице A_C.Но я не знаю, какова длина списка параметров, раньше времени.Он варьирует вызов метода по вызову метода.
Чтобы привести конкретный пример
Таблица A содержит список «идентификаторов клиентов» и «почтовых индексов».Таблица A_C имеет первичные ключи, содержащие «CustomerIDs» и «Categories».Таблица C имеет «категории».Я нахожу клиентов в таблице А, которые живут по определенному «почтовому индексу».Затем из этого подмножества мне нужно выяснить, кто из этих клиентов выбрал определенные продукты, которые подпадают под определенные категории, найденные в таблице ссылок Таблица A_C: Продукты питания, Одежда и т. Д., Но мой веб-метод не знает заранее, что это за категориискорее они передаются в виде списка: List myCategoryList (который может быть 1 категорией или 100, зависит от вызова метода с помощью вызова метода).
Как мне написать проекцию, используя Linq-to-Entities?
List<string> CategoryList = new List<string>() { "Food", "Shelter", "Housing" }; // in one call to the web service method
List<string> CategoryList = new List<string>() { "Food", "Clothing" }; //in a second call--varies and I don't know ahead of time which is which.
Так как я могу сделать проекцию, используя Linq-to-Entities?Я открою второй поток.