powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL - непонятный кореллированный подзапрос...
25 сообщений из 31, страница 1 из 2
LINQ to SQL - непонятный кореллированный подзапрос...
    #35537724
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делаю такой групповой запрос:
Код: plaintext
1.
2.
from c in db.Categories
join p in db.Products on c.CategoryID equals p.CategoryID into g
select new { Category = c, Products = g}
При трассировке SQL наблюдаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description], [t0].[Picture], [t1].[ProductID], [t1].[ProductName], [t1].[SupplierID], [t1].[CategoryID] AS [CategoryID2], [t1].[QuantityPerUnit], [t1].[UnitPrice], [t1].[UnitsInStock], [t1].[UnitsOnOrder], [t1].[ReorderLevel], [t1].[Discontinued], [color=red](
    SELECT COUNT(*)
    FROM [Products] AS [t2]
    WHERE ([t0].[CategoryID]) = [t2].[CategoryID]
    ) AS [value][/color]
FROM [Categories] AS [t0]
LEFT OUTER JOIN [Products] AS [t1] ON ([t0].[CategoryID]) = [t1].[CategoryID]
ORDER BY [t0].[CategoryID], [t1].[ProductID]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build:  3 . 5 . 30729 . 1 
Наблюдается наличие кореллированного подзапроса. При просмотре плана выполнения видно, что оптимизатор догадывается от него избавиться, но, всё равно, по-моему это как-то не айс.

Вот и непонятно - для чего на самом деле этот COUNT() нужен и как в случае чего от него избавиться?

Сам я подозреваю, что это фреймворк оптимизирует свою сторону - запрашивает вместе со всей байдой COUNT() чтобы типа как заранее выделить память под возвращаемый список, но можно ли это поведение как-то изменить - не знаю.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35538034
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тоже встретил такую штуку, но решил не думать - скуль сам умный и исправит без проблем такие моменты. Счетчик скорее всего действительно для внутренних оптимизаций, можешь покапаться рефлектором, если хочешь
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35539173
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавная получается парочка!Один генерит левые подзапросы, а другой посылает их в сад.
На основании чего сделан вывод автор, что оптимизатор догадывается от него избавиться?
Отимизатор не должен курочить запросы.Интересно посмотреть на план выполнения
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35539345
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa
На основании чего сделан вывод автор, что оптимизатор догадывается от него избавиться?

читать умеем? человек же написал - на основании плана

SeVa
Отимизатор не должен курочить запросы.
оптимизатор на то и оптимизатор, что он должен переделать запрос так, чтобы выполнить его наиболее оптимально. Да собственно это касается любых оптимизаторов, не только sql, или как по-твоему можно оптимизировать кусок кода, не трогая его? помолиться, чтобы он выполнился побыстрее?
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35539711
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaЗабавная получается парочка!Один генерит левые подзапросы, а другой посылает их в сад.
На основании чего сделан вывод автор, что оптимизатор догадывается от него избавиться?
Отимизатор не должен курочить запросы.Интересно посмотреть на план выполнения
"Избавиться" в данном контексте означало заменить корелляцию джойном.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542008
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зы
читать умеем? человек же написал - на основании плана
оптимизатор на то и оптимизатор, что он должен переделать запрос так, чтобы выполнить его наиболее оптимально. Да собственно это касается любых оптимизаторов, не только sql, или как по-твоему можно оптимизировать кусок кода, не трогая его? помолиться, чтобы он выполнился побыстрее?


Читать я умею, а вот относительно того, что ты умеешь читать планы выполнения, у меня большие сомнения.
Оптимизатор SQL в корне отличается от других, он только пытается построить оптимальный план выполнения и подзапросы не выбрасывает.В 2005 обязательно должен быть Aggregate(посчет count для каждой категории), а затем джойн(по-другому быть и не может),но от этого легче не станет.У меня была таблица, где продуктов было > 800К и на таком запросе пользователи могли бы смело идти на перекур.
С 2008 я еще не работал и поэтому просил показать план,но даже без него понятно, что LINQ в качестве ОRM рассматривать не стоит.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542221
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну я план выполнения не смотрел :) Баде поверил на слово. Посмотрел сам, план действительно содержит stream aggregate, без подзапроса ессесно все сильно короче. Но у меня данных не сильно много и много не планируется по определению, поэтому я забил. Источник появления count(*) конечно был бы интересно понять, возможно расписано на linq форумах, но пока не до них.

Код: plaintext
но даже без него понятно, что LINQ в качестве ОRM рассматривать не стоит.
у каждой медали есть две стороны, в каком ещё ORM можно с такой легкостью получить результат любой выборки?
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542235
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати написал запрос в таком виде (я люблю больше такую форму, отличие - отдельная явная выборка внутренней коллекции):

Код: plaintext
1.
2.
3.
4.
5.
6.
db.Categories
    .Select(c=> 
         new {
              Category = c,
              Products = db.Products.Where(p=>p.CategoryID==c.CategoryID)
         });
linq оказался достаточно умным, чтобы сделать из него точно такой же запрос :)
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542285
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автору каждой медали есть две стороны, в каком ещё ORM можно с такой легкостью получить результат любой выборки?

Согласен,чудес не бывает.Выигрываем в одном,проигрываем в другом.Но в итоге выигрыш оказывается весь сомнительным и БД оказывается в дауне, на основании чего делается вывод,
что для SQL обязательно нужен application server и кэш.

LINQ засовывает count во все запросы?
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542295
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку в EF такая же полова?
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542907
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaВ 2005 обязательно должен быть Aggregate(посчет count для каждой категории), а затем джойн(по-другому быть и не может)
Так и есть. Ниже кусок плана где это видно. А неужели вы думаете что это не быстрее чем корелляция? Особенно если учесть, что MSSQL умеет строить временные индексы когда считает это нужным.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542909
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыlinq оказался достаточно умным, чтобы сделать из него точно такой же запрос :)
Ну это неудивительно, если учесть, что C# сначала превращает LINQ-форму в функциональную :-)
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542918
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa
LINQ засовывает count во все запросы?
нет конечно :) только в подобный т.н. group join
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542921
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорный Бада
Ну это неудивительно, если учесть, что C# сначала превращает LINQ-форму в функциональную :-)
учитывая что процесс этот не слишком тривиальный (попробуй написать свой адаптер), то можно порадоваться что он это умеет делать достаточно умно
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542922
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорный Бада
Так и есть. Ниже кусок плана где это видно. А неужели вы думаете что это не быстрее чем корелляция? Особенно если учесть, что MSSQL умеет строить временные индексы когда считает это нужным.
суть в том, что если убрать этот count(*), то запрос сильно упрощается. А по сути можно и без него обойтись, просто немного сложнее будет собрать вложенную коллекцию, надо будет постоянно отслеживать то что parent запись не изменилась.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35542967
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaLINQ засовывает count во все запросы?
На самом деле вообще-то с LINQ ещё можно использовать руками написанные запросы, а не те что он генеририт.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35543380
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чорный Бада SeVaLINQ засовывает count во все запросы?
На самом деле вообще-то с LINQ ещё можно использовать руками написанные запросы, а не те что он генеририт. :O Да ну... или что Вы имеете в виду? типа свой транслятор блямбда выражений в скл запросы?
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35543487
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в какой-то бете был синтаксис вызова чистого SQL, в релизе я его не нашел, к счастью :) ещё можно дергать хранимые процедуры
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35544036
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор Ниже кусок плана где это видно. А неужели вы думаете что это не быстрее чем корелляция?

Нисколько не быстрее.Это она и есть(именно это я и ожидал увидеть),никому ненужный подсчет кол-ва.

авторв какой-то бете был синтаксис вызова чистого SQL, в релизе я его не нашел, к счастью :) ещё можно дергать хранимые процедуры
Вы напрасно полагаетесь на оптимизатор-это штука достаточно дубовая, работаем методом простого перебора.При кол-ве таблиц больше пяти-шести, план может быть совсем не оптимальным.В таких случаях и нужны хинты или хранимые процедуры.
Еще один момент.Все запросы должны ходить в одном направлении, иначе будут мертвые блокировки.В данном заросе нужен хинт NOLOCK.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35544149
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
buser:O Да ну... или что Вы имеете в виду?
вот это
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35544344
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa
Еще один момент.Все запросы должны ходить в одном направлении, иначе будут мертвые блокировки.В данном заросе нужен хинт NOLOCK.
кстати отсутствие возможности ставить хинты во многих ORM несколько удручает. Например у нас есть система на llblgen, база большую часть дня используется только на чтение, но раз в день обновляется. Так вот в момент обновления вываливается некоторое количество блокировок, которых по-идее можно было бы избежать.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35544504
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Больше всего в ORM удручает-корявые запросы,которые они генерят
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35544859
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну не писать же все руками :) это ужасный сложноподдерживаемый страх.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35545135
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторну не писать же все руками :) это ужасный сложноподдерживаемый страх

Hand made всегда качественней.Подобные тулзовины скрывают тонкости, а знать сиквелевые патроха никому не помешает.
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35545150
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa авторну не писать же все руками :) это ужасный сложноподдерживаемый страх

Hand made всегда качественней.Подобные тулзовины скрывают тонкости, а знать сиквелевые патроха никому не помешает. Зело зависит от места их (хендсов) отростания... но это уже лирика... а так да... the devil is in the details
...
Рейтинг: 0 / 0
25 сообщений из 31, страница 1 из 2
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL - непонятный кореллированный подзапрос...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]