Сообщение Re[90]: В России опять напишут новый объектно-ориентированны от 12.07.2018 15:36
Изменено 12.07.2018 16:01 Danchik
Re[90]: В России опять напишут новый объектно-ориентированны
Здравствуйте, Sinclair, Вы писали:
_>>Так некий абстрактный "взрослый движок в сервере приложений" в теории "может" это обнаружить или же есть конкретный движок, который вот таких образом на практике оптимизирует вот этот конкретный пример?
S>Да, linq2db выбрасывает дегенеративные джойны.
S>Вот, например:
S>
S>В сервер уезжает вот такой вот SQL:
S>
S>При этом если я попробую материализовать не orderProjection, а allOrders, то исполнится запрос вместе с джойном:
S>
Как автор даной оптимизации, скажу что здесь непорядок. Сабселект тоже надо убрать. Займусь на досуге.
_>>Так некий абстрактный "взрослый движок в сервере приложений" в теории "может" это обнаружить или же есть конкретный движок, который вот таких образом на практике оптимизирует вот этот конкретный пример?
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>В сервер уезжает вот такой вот SQL:
S>
S>При этом если я попробую материализовать не orderProjection, а allOrders, то исполнится запрос вместе с джойном:
S>
Как автор даной оптимизации, скажу что здесь непорядок. Сабселект тоже надо убрать. Займусь на досуге.
Ну и хотелось бы чтобы пользовались новыми, легко читаемыми, расширениями для джоинов LeftJoin
_>>Так некий абстрактный "взрослый движок в сервере приложений" в теории "может" это обнаружить или же есть конкретный движок, который вот таких образом на практике оптимизирует вот этот конкретный пример?
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