powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL - непонятный кореллированный подзапрос...
31 сообщений из 31, показаны все 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
LINQ to SQL - непонятный кореллированный подзапрос...
    #35545177
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVa
Hand made всегда качественней.Подобные тулзовины скрывают тонкости, а знать сиквелевые патроха никому не помешает.
ещё предложи к ассемблеру вернуться, знать как работает процессор всегда полезно
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35545251
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SeVaHand made всегда качественней.Подобные тулзовины скрывают тонкости, а знать сиквелевые патроха никому не помешает.
Спасибо не надо. Насмотрелись по жизни уже вашего (ну, не лично вашего а вообще) "качественного хендмейда" :-)
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35546184
SeVa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все зависит от того откуда руки растут.Агитировать никого не собираюсь, но я тоже не по наслышке знаю, что такое ORM.Далеко ходить не нужно,достаточно посмотреть на данный запрос. Здесь гарантированны дедлоки и недетские тормоза
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35563851
зы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
че-то меня линк сегодня сильно разочаровал

запрос вроде обычный
Код: plaintext
db.Table.OrderBy(p=>p.SortField).Take( 30 ).Select(p=>new MyObj() {..})

превращается вот в такое дерьмище
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT field1,field2,...
FROM (
    SELECT TOP ( 30 ) field1,field2,...
    FROM [dbo].[Table] AS [t0]
    ORDER BY [t0].[SortField]
    ) AS [t1]
ORDER BY [t1].[SortField]

Без Take все нормально. Дальше-хуже. Я в этом запросе делаю groupjoin и вытягиваю для каждого элемента подколлекцию.
Если без Take, то все пучком. С Take - жесть и подколлекция тянется отдельным запросом на каждый элемент основного списка. Если добавить Skip, то опять все тянется за раз, правда очень страшным запросом (из-за сортировки) :)


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT field1,field2, ..., (
    SELECT COUNT(*)
    FROM (
        SELECT NULL AS [EMPTY]
        FROM [dbo].[SubTable] AS [t4]
        WHERE [t4].[SubTable.pr_id] = [t2].[id]
        ) AS [t5]
    ) AS [value]
FROM (
    SELECT t1.field1,t1.field2,..., [t1].[ROW_NUMBER]
    FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY [t0].[SortField], [t0].[id]) AS [ROW_NUMBER], ...
        FROM [dbo].[Table] AS [t0]
        ) AS [t1]
    WHERE [t1].[ROW_NUMBER] BETWEEN @p0 +  1  AND @p0 + @p1
    ) AS [t2]
LEFT OUTER JOIN [dbo].[SubTable] AS [t3] ON [t3].[pr_id] = [t2].[id]
ORDER BY [t2].[ROW_NUMBER], [t3].[id]

прям песдец какой-то, раньше я за ним такого бреда не замечал. В результате с пейджингом первая страница тянется мегадолго (из-за того что он подтягивает для каждой строки коллекцию), а все остальные мегабыстро. бред %(
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35564136
Чорный Бада
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зыпревращается вот в такое дерьмище
Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT field1,field2,...
FROM (
    SELECT TOP ( 30 ) field1,field2,...
    FROM [dbo].[Table] AS [t0]
    ORDER BY [t0].[SortField]
    ) AS [t1]
ORDER BY [t1].[SortField]

смотрится говённо, но, с практической точки зрения ничего страшного - ИМХО, на 30 записях чем-либо убить производительность всё равно нереально.

Дальше-хуже. Я в этом запросе делаю groupjoin и вытягиваю для каждого элемента подколлекцию.
Если без Take, то все пучком. С Take - жесть и подколлекция тянется отдельным запросом на каждый элемент основного списка.
Тут надо было бы попробовать поиграться с опцией LoadWith(...)
...
Рейтинг: 0 / 0
LINQ to SQL - непонятный кореллированный подзапрос...
    #35564292
зыы
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
идея была ничего, но это нифига не меняет :(
...
Рейтинг: 0 / 0
31 сообщений из 31, показаны все 2 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ to SQL - непонятный кореллированный подзапрос...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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