могу ли я увидеть, эффективно ли SQL / использует L2S для обновления нескольких записей?

#c# #sql-server #linq-to-sql

#c# #sql-сервер #linq-to-sql

Вопрос:

Я только что сделал следующее:

 var items =
    from c in Items
    where 
            c.Pid == Campaigns.Where(d=>d.Campaign_name=="US - Autos.com").First().Pid
        amp;amp;  c.Affid == Affiliates.Where(e=>e.Add_code=="CD4729").First().Affid
    select c;
  

Затем я хочу обновить поле для всех результатов:

 items.ToList().ForEach(c=>c.Cost_per_unit=8);  
SubmitChanges();
  

При выполнении запроса я знаю, что могу использовать:

 GetCommand(items);
  

Чтобы увидеть SQL, который будет выполнен.

Но при отправке изменений я не знаю, как это сделать.

Я посмотрел на:

 GetChangeSet()
  

И я вижу, что в этом случае имеется около 18 обновлений.

ВОПРОС 1: существуют ли проблемы с эффективностью при использовании L2S для обновления таким способом?

ВОПРОС 2 (возможно, это должен быть отдельный вопрос, но я попробую его здесь): есть ли общий способ просто отслеживать инструкции SQL, которые отправляются на SQL Server 2008 R2? Думаю, я мог бы отключить для экземпляра все, кроме TCP, и отключить порт WireShark (если материал вообще доступен для чтения), но я надеюсь, что есть более простой способ.

Комментарии:

1. 2: да, профилировщик SQL Server. Это находится в вашем меню «Пуск» в разделе SQL Server, инструменты производительности. По умолчанию отображаются все инструкции во всех сеансах, но вы можете отфильтровать свои собственные.

Ответ №1:

DataContext имеет свойство Log, к которому вы можете подключиться для сброса выполненного SQL. Также существует Linq To Sql Profiler, который является потрясающим.

Ответ №2:

При выполнении запроса я знаю, что могу использовать:

GetCommand(items); Чтобы увидеть SQL, который будет выполнен.

Но при отправке изменений я не знаю, как это сделать.

Возможно, вы сможете использовать это:

 yourContext.Log = Console.Out;
  

Но я не уверен, регистрирует ли это весь SQL или только select s.

Ваш SQL отличается для каждого затронутого объекта. L2S будет использовать зависимости для определения порядка, в котором объекты должны быть сохранены (если порядок важен), затем создаст операторы SQL insert , update и delete для сохранения изменений. Сгенерированные инструкции (особенно для update ) зависят от того, какие свойства объекта изменились. В частности, нет способа просмотреть весь пакет, который будет выполнен.

ВОПРОС 1: существуют ли проблемы с эффективностью при использовании L2S для обновления таким способом?

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

ВОПРОС 2 (возможно, это должен быть отдельный вопрос, но я попробую его здесь): есть ли общий способ просто отслеживать инструкции SQL, которые отправляются на SQL Server 2008 R2? Я отключаю для экземпляра все, кроме TCP, и отключаю порт WireShark, но я надеюсь, что есть более простой способ.

Это должен быть другой вопрос, но ответ заключается в использовании трассировки. Хотя вы можете выполнять трассировку с любой версией SQL Server (включая Express), инструмент профилировщика SQL Server, который поставляется со всеми версиями, отличными от Express, делает это очень простым. Если вам нужна дополнительная информация по этому вопросу, не стесняйтесь задать другой вопрос с вашими конкретными проблемами.

Ответ №3:

Что касается эффективности — Конечно, существуют более эффективные способы выполнения обновления, как это описано в вашем вопросе; Например, SQL-запрос, подобный этому, был бы намного эффективнее (не выполнялся бы запрос SELECT, код, выполняемый для извлечения данных из SQL в набор объектов, код, выполняемый для выполнения обновления объектов, код, выполняемый для определения того, какие объекты изменились, код, выполняемый для генерации соответствующих инструкций SQL, и запросы НА ОБНОВЛЕНИЕ, выполняемые на SQL server):

 UPDATE Items SET Cost_per_unit = @CostPerUnit
FROM Items
    JOIN Campaigns ON ...
    JOIN Affiliates ON ...
WHERE ...
  

Но Linq to SQL не предоставляет никакого способа построения такого запроса. Если вы собираетесь обновлять тысячи строк очень простым способом, аналогичным вашему вопросу, возможно, вам лучше вместо этого запустить инструкцию SQL, подобную этой. Если не будет обновлено так много строк или если логика более сложная, тогда сохраните ее в Linq to SQL.