Информация об изменениях

Сообщение Re[90]: В России опять напишут новый объектно-ориентированны от 12.07.2018 15:36

Изменено 12.07.2018 16:01 Danchik

Re[90]: В России опять напишут новый объектно-ориентированны
Здравствуйте, Sinclair, Вы писали:

_>>Так некий абстрактный "взрослый движок в сервере приложений" в теории "может" это обнаружить или же есть конкретный движок, который вот таких образом на практике оптимизирует вот этот конкретный пример?

S>Да, linq2db выбрасывает дегенеративные джойны.
S>Вот, например:
S>
S>   using (var db = new DbOrderTests())
S>            {
S>                var allOrders = from oi in db.OrderItems
S>                                group oi by oi.OrderId into og
S>                                from o in db.Orders.Where(q=>q.Id == og.Key).DefaultIfEmpty()
S>                                select new { OrderId = og.Key, Amount = og.Sum(oi => oi.Amount), o.Counterparty, o.CreationDate };
S>                var orderProjection = from a in allOrders select a.OrderId;
S>                foreach (var id in orderProjection)
S>                    Console.WriteLine(id);
S>            }                                

S>

S>В сервер уезжает вот такой вот SQL:
S>
S>SELECT
S>    [t2].[OrderId] as [OrderId1]
S>FROM
S>    (
S>        SELECT
S>            [t1].[OrderId]
S>        FROM
S>            [OrderItems] [t1]
S>        GROUP BY
S>            [t1].[OrderId]
S>    ) [t2]
S>

S>При этом если я попробую материализовать не orderProjection, а allOrders, то исполнится запрос вместе с джойном:
S>
S>SELECT
S>    [t2].[OrderId] as [OrderId1],
S>    [t2].[c1] as [c11],
S>    [q].[Counterparty],
S>    [q].[CreationDate]
S>FROM
S>    (
S>        SELECT
S>            [t1].[OrderId],
S>            Sum([t1].[Amount]) as [c1]
S>        FROM
S>            [OrderItems] [t1]
S>        GROUP BY
S>            [t1].[OrderId]
S>    ) [t2]
S>        LEFT JOIN [Orders] [q] ON [q].[Id] = [t2].[OrderId]
S>


Как автор даной оптимизации, скажу что здесь непорядок. Сабселект тоже надо убрать. Займусь на досуге.
Re[90]: В России опять напишут новый объектно-ориентированны
Здравствуйте, Sinclair, Вы писали:

_>>Так некий абстрактный "взрослый движок в сервере приложений" в теории "может" это обнаружить или же есть конкретный движок, который вот таких образом на практике оптимизирует вот этот конкретный пример?

S>Да, linq2db выбрасывает дегенеративные джойны.
S>Вот, например:
S>
S>   using (var db = new DbOrderTests())
S>            {
S>                var allOrders = from oi in db.OrderItems
S>                                group oi by oi.OrderId into og
S>                                from o in db.Orders.Where(q=>q.Id == og.Key).DefaultIfEmpty()
S>                                select new { OrderId = og.Key, Amount = og.Sum(oi => oi.Amount), o.Counterparty, o.CreationDate };
S>                var orderProjection = from a in allOrders select a.OrderId;
S>                foreach (var id in orderProjection)
S>                    Console.WriteLine(id);
S>            }                                

S>

S>В сервер уезжает вот такой вот SQL:
S>
S>SELECT
S>    [t2].[OrderId] as [OrderId1]
S>FROM
S>    (
S>        SELECT
S>            [t1].[OrderId]
S>        FROM
S>            [OrderItems] [t1]
S>        GROUP BY
S>            [t1].[OrderId]
S>    ) [t2]
S>

S>При этом если я попробую материализовать не orderProjection, а allOrders, то исполнится запрос вместе с джойном:
S>
S>SELECT
S>    [t2].[OrderId] as [OrderId1],
S>    [t2].[c1] as [c11],
S>    [q].[Counterparty],
S>    [q].[CreationDate]
S>FROM
S>    (
S>        SELECT
S>            [t1].[OrderId],
S>            Sum([t1].[Amount]) as [c1]
S>        FROM
S>            [OrderItems] [t1]
S>        GROUP BY
S>            [t1].[OrderId]
S>    ) [t2]
S>        LEFT JOIN [Orders] [q] ON [q].[Id] = [t2].[OrderId]
S>


Как автор даной оптимизации, скажу что здесь непорядок. Сабселект тоже надо убрать. Займусь на досуге.
Ну и хотелось бы чтобы пользовались новыми, легко читаемыми, расширениями для джоинов LeftJoin