powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - проще
58 сообщений из 58, показаны все 3 страниц
LINQ - проще
    #39747012
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сегодня осознал, что EF проще. Вот такой LINQ

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
            var vhcChkLists = await _db.TblVehicleCheckListDetails
                .GroupBy(p => p.AssignedVehicleCheckList)
                .Select(p => new
                {
                    AnsweredQuestion = p.Where(c => c.Answer != null).Count(),
                    NoQuestion = p.Where(c => c.Answer == 2).Count(),
                    TotalQuestion = p.Count(),
                    p.Key.ASSTCode,
                    p.Key.CheckDate,
                    p.Key.CreatedBy,
                    p.Key.Id,
                    p.Key.OdometerReading,
                    p.Key.TruckUnit,
                    p.Key.Comments,
                    p.Key.PCCode
                })
                .OrderByDescending(p => p.Id)
                .ToListAsync();


нарисовал такой sql и секономил мне несколколько седых волос на попе.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
SELECT 
    [Project2].[Id] AS [Id], 
    [Project2].[C2] AS [C1], 
    [Project2].[C3] AS [C2], 
    [Project2].[C1] AS [C3], 
    [Project2].[ASSTCode] AS [ASSTCode], 
    [Project2].[CheckDate] AS [CheckDate], 
    [Project2].[CreatedBy] AS [CreatedBy], 
    [Project2].[OdometerReading] AS [OdometerReading], 
    [Project2].[TruckUnit] AS [TruckUnit], 
    [Project2].[Comments] AS [Comments], 
    [Project2].[PCCode] AS [PCCode]
    FROM ( SELECT 
        [Project1].[C1] AS [C1], 
        [Project1].[Id] AS [Id], 
        [Project1].[CheckDate] AS [CheckDate], 
        [Project1].[TruckUnit] AS [TruckUnit], 
        [Project1].[PCCode] AS [PCCode], 
        [Project1].[OdometerReading] AS [OdometerReading], 
        [Project1].[ASSTCode] AS [ASSTCode], 
        [Project1].[CreatedBy] AS [CreatedBy], 
        [Project1].[Comments] AS [Comments], 
        [Project1].[C2] AS [C2], 
        (SELECT 
            COUNT(1) AS [A1]
            FROM [dbo].[TblVehicleCheckListDetails] AS [Extent4]
            WHERE (([Project1].[Id] = [Extent4].[AssignedVehicleCheckListId]) OR (1 = 0)) AND (2 = [Extent4].[Answer])) AS [C3]
        FROM ( SELECT 
            [GroupBy1].[A1] AS [C1], 
            [GroupBy1].[K1] AS [Id], 
            [GroupBy1].[K2] AS [CheckDate], 
            [GroupBy1].[K3] AS [TruckUnit], 
            [GroupBy1].[K4] AS [PCCode], 
            [GroupBy1].[K6] AS [OdometerReading], 
            [GroupBy1].[K7] AS [ASSTCode], 
            [GroupBy1].[K8] AS [CreatedBy], 
            [GroupBy1].[K10] AS [Comments], 
            (SELECT 
                COUNT(1) AS [A1]
                FROM [dbo].[TblVehicleCheckListDetails] AS [Extent3]
                WHERE (([GroupBy1].[K1] = [Extent3].[AssignedVehicleCheckListId]) OR (1 = 0)) AND ([Extent3].[Answer] IS NOT NULL)) AS [C2]
            FROM ( SELECT 
                [Extent2].[Id] AS [K1], 
                [Extent2].[CheckDate] AS [K2], 
                [Extent2].[TruckUnit] AS [K3], 
                [Extent2].[PCCode] AS [K4], 
                [Extent2].[CheckedBy] AS [K5], 
                [Extent2].[OdometerReading] AS [K6], 
                [Extent2].[ASSTCode] AS [K7], 
                [Extent2].[CreatedBy] AS [K8], 
                [Extent2].[CreatedOn] AS [K9], 
                [Extent2].[Comments] AS [K10], 
                COUNT(1) AS [A1]
                FROM  [dbo].[TblVehicleCheckListDetails] AS [Extent1]
                INNER JOIN [dbo].[TblVehicleCheckLists] AS [Extent2] ON [Extent1].[AssignedVehicleCheckListId] = [Extent2].[Id]
                GROUP BY [Extent2].[Id], [Extent2].[CheckDate], [Extent2].[TruckUnit], [Extent2].[PCCode], [Extent2].[CheckedBy], [Extent2].[OdometerReading], [Extent2].[ASSTCode], [Extent2].[CreatedBy], [Extent2].[CreatedOn], [Extent2].[Comments]
            )  AS [GroupBy1]
        )  AS [Project1]
    )  AS [Project2]
    ORDER BY [Project2].[Id] DESC

...
Рейтинг: 0 / 0
LINQ - проще
    #39747015
Фотография Relic Hunter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не обошлось и без магии компиляйтора

Код: sql
1.
OR (1 = 0)
...
Рейтинг: 0 / 0
LINQ - проще
    #39747073
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.
...
Рейтинг: 0 / 0
LINQ - проще
    #39747074
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,

колонка Comments случаем не NVARCHAR (MAX)?
...
Рейтинг: 0 / 0
LINQ - проще
    #39747289
PinkCat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANA,

На SQL это в строк двадцать можно выразить и без подзапросов.
-----
И выполнятся оно будет и на мелкомягком, и на оркале, и на постгрее...
И будет работать даже когда типы поменяются...
...
Рейтинг: 0 / 0
LINQ - проще
    #39747475
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAНа SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.

Конечно на порядок быстрее не будет.

Быстрее будет только если написать совсем _другой_ запрос.
А не тот же самый, но по-другому.

И конечно надо правильно писать и читать LINQ, чтобы понимать, какой запрос на это сгенерируется.
...
Рейтинг: 0 / 0
LINQ - проще
    #39747506
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttБыстрее будет только если написать совсем _другой_ запрос.
А не тот же самый, но по-другому.
Что значит тот же самый? Возвращающий аналогичный результат?

К примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.
...
Рейтинг: 0 / 0
LINQ - проще
    #39747797
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAЧто значит тот же самый? Возвращающий аналогичный результат?

да, аналогичный результат при тех же вводных

skyANAК примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.

это предположение?
наши опыты и тесты показывают, что оптимизатор БД в состоянии "страшный" запрос, генерируемый EF, выполнить также быстро, как SQL, написанный вручную.

обычно это верно для 90% запросов.

бывает, что EF генерит какую-то дичь, но это для сложных случаев, которые даже LINQ без пол бутылки не разобрать.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748058
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttнаши опыты и тесты показывают, что оптимизатор БД в состоянии "страшный" запрос, генерируемый EF, выполнить также быстро, как SQL, написанный вручную.

обычно это верно для 90% запросов.
ИМХО Это запросы переводящиеся в SQL сменой синтаксиса. LINQ близок к SQL по синтаксису. Оставшиеся 10% - это то что один-в-один в select не трасформируется.

Оптимизатор БД не переоценивай. В MS SQL он продвинутый, но не сильно. На сложных запросах может выбирать очень неоптимальные планы выполнения.

PS Идеология "CodeFirst наше всё" ведет к тому что проблему оставшихся 10% решать будет некому. Данный топик пример этого.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748268
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>hVostt, вчера, 11:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21763808][21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748309
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
Хотите вернутся к срачу linq или ОРМ?
Поезд ушел.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748310
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,
Не так)
Linq (ORM) или SQL.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748320
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAК примеру запрос со вложенными SELECT COUNT вернёт тоже самое, что и SELECT SUM(CASE, но при этом последний будет в разы короче и быстрее.
Оконными функциями также можно всё короче и быстрее оформить.

это предположение?
Это опыт.

Раз в год приходят ко мне с просьбой помочь ускорить запрос.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748321
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttобычно это верно для 90% запросов.
С этим не спорю. Речь конкретно про запрос в начале топика.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748323
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>hVostt, вчера, 11:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21763808][21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.
Бекап базы у автора топика попросим что-ли?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748329
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttskyANAНа SQL это в строк двадцать можно выразить и без подзапросов.
Выполняться будет на порядок быстрее.

Конечно на порядок быстрее не будет.

Быстрее будет только если написать совсем _другой_ запрос.
А не тот же самый, но по-другому.

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

почему я тебя понял, а skyANA начал задавать "уточняющие" вопросы?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748330
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Petro123ВМоисеев,
Не так)
Linq (ORM) или SQL.

это вечный срач
...
Рейтинг: 0 / 0
LINQ - проще
    #39748331
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAВМоисеев>hVostt, вчера, 11:19 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21763808][21763808]
>наши опыты и тесты показывают...также быстро, как SQL, написанный вручную...обычно это верно для 90% запросов.
<давайте проверим на данном конкретном примере.
Бекап базы у автора топика попросим что-ли?


будешь оптимизировать его запросы? тебе делать нечего, всего достиг?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748338
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachPetro123ВМоисеев,
Не так)
Linq (ORM) или SQL.

это вечный срач)))
В Java года три уже как прошёл))
...
Рейтинг: 0 / 0
LINQ - проще
    #39748349
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748351
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748352
ВМоисеев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748354
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев>skyANA, сегодня, 10:26 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1306630&msg=21764657][21764657]
>Бекап базы у автора топика попросим что-ли?
<Вы что-то говорили про 20 строк - так предъявите их автору топика. Он проверит, получит цифирки сравнения и никакого срача.
А я думал Вы сами хотите проверить.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748356
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВМоисеев,

автор топика не удосужился ответить на вопрос о типа колонки Comments, ему походу топик совсем не интересен
...
Рейтинг: 0 / 0
LINQ - проще
    #39748362
love_bach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухВМоисеев,

автор топика не удосужился ответить на вопрос о типа колонки Comments, ему походу топик совсем не интересен

ну, допустим, varchar(MAX). возможно, извлекает только по Id. возможно в какой-то журнал извлекает записи, где это поле только первые надцать символов. что дальше?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748373
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
love_bachДмитрий МухВМоисеев,

автор топика не удосужился ответить на вопрос о типа колонки Comments, ему походу топик совсем не интересен

ну, допустим, varchar(MAX). возможно, извлекает только по Id. возможно в какой-то журнал извлекает записи, где это поле только первые надцать символов. что дальше?
А то, что надо значть особенности хранения NVARCHAR(MAX) и как это негативно складывается на производительности выборки, когда нужно не одну запись по Id получить, а множество, да ещё и с группировкой как у ТС.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748374
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поправлюсь: как негативно это может сложится на производительности выборки.

Я же не знаю какие там у ТС объёмы.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748517
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОптимизатор БД не переоценивай. В MS SQL он продвинутый, но не сильно. На сложных запросах может выбирать очень неоптимальные планы выполнения.

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

Это не так.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748518
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttбольшим количеством запросов.

*способов
...
Рейтинг: 0 / 0
LINQ - проще
    #39748563
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttDima TОптимизатор БД не переоценивай. В MS SQL он продвинутый, но не сильно. На сложных запросах может выбирать очень неоптимальные планы выполнения.

Неоптимальный план выполнения будет только при изначально неправильно составленном запросе.
А что значит неправильно? Получившийся в начале топика запрос он как составлен?

Ну и сильное конечно утверждение: "только при изначально неправильно составленном запросе"
...
Рейтинг: 0 / 0
LINQ - проще
    #39748564
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttЕсть много сахара, позволяющего сократить запрос
Например?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748613
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухА что значит неправильно? Получившийся в начале топика запрос он как составлен?

Ну и сильное конечно утверждение: "только при изначально неправильно составленном запросе"


Это нормальное утверждение. Посмотри на LINQ запрос в начале топика с точки зрения коллекции объектов. Посмотри на получившийся запрос в SQL. Сделано ровно то, что было запрошено в LINQ.

Если запрос LINQ собирается динамически, то гарантировано всё будет правильно работать.

Ты начинаешь смотреть на задачу иначе с точки зрения объединения запросов или оконных функций, будучи уверенным, что это действительно _на порядки_ будет быстрее. С чего вдруг-то?

Неправильно составленный запрос, это который также неоптимален, или неверен и в LINQ.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748614
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухhVosttЕсть много сахара, позволяющего сократить запрос
Например?

with, расширяющие функции, раширенные функции и операторы для группировки, оконные функции, дофига всего.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748618
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий Мухпропущено...

Например?

with, расширяющие функции, раширенные функции и операторы для группировки, оконные функции, дофига всего.
И почему же это сахар? К примеру в курсе как работают оконные функции под капотом?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748635
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухИ почему же это сахар? К примеру в курсе как работают оконные функции под капотом?

В курсе, не во всех случаях конечно.

Скажи ещё, не знаешь, как, например, пронумеровать записи без оконных функций? ))
...
Рейтинг: 0 / 0
LINQ - проще
    #39748647
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий МухИ почему же это сахар? К примеру в курсе как работают оконные функции под капотом?

В курсе, не во всех случаях конечно.

Скажи ещё, не знаешь, как, например, пронумеровать записи без оконных функций? ))
Я знаю как переписать запрос в стартовом посте не в четыре этажа, а в один, гораздо короче и без оконных функций.
И про меньше или равно и COUNT я тоже знаю
...
Рейтинг: 0 / 0
LINQ - проще
    #39748734
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухЯ знаю как переписать запрос в стартовом посте не в четыре этажа, а в один, гораздо короче и без оконных функций.

Да, но это будет другой запрос. Даже если он будет возвращать аналогичные результаты. Просто прочитай, что задекларировано в LINQ. А если вот эти Count-ы, будут использовать динамические LINQ выражения, или вообще всё строится на спецификациях? Не всё так просто, как может показаться в лоб.

Да и в LINQ можно переписать запрос, вот эта задача выглядит по-интереснее.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748735
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или нам не нужны Count-ы в результатах, а как условие для сортировки или фильтрации, м?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748770
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttDima TОптимизатор БД не переоценивай. В MS SQL он продвинутый, но не сильно. На сложных запросах может выбирать очень неоптимальные планы выполнения.

Неоптимальный план выполнения будет только при изначально неправильно составленном запросе.
Неоднократно сталкивался с тормозами MSSQL в запросах с подзапросами
Код: sql
1.
select ... from (select ...) ...


Оптимизатор почему-то строил нездоровый план. В итоге лечил временными таблицами
Код: sql
1.
2.
select ... into #tmp ...
select ... from #tmp ...


БД большая, некоторые запросы ускорялись в 10 и более раз.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748779
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TОптимизатор почему-то строил нездоровый план.
Вот первых учесть все правила построения оптимального плана любого запроса - это не реально.
А во вторых оптимизатор ограничен по времени. Из того, что успел построить, выбрал более подходящий.

Никакой магии.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748780
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttИли нам не нужны Count-ы в результатах, а как условие для сортировки или фильтрации, м?
Перечитай первое сообщение в топике
...
Рейтинг: 0 / 0
LINQ - проще
    #39748786
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima ThVosttпропущено...


Неоптимальный план выполнения будет только при изначально неправильно составленном запросе.
Неоднократно сталкивался с тормозами MSSQL в запросах с подзапросами
Код: sql
1.
select ... from (select ...) ...



Оптимизатор почему-то строил нездоровый план. В итоге лечил временными таблицами
Код: sql
1.
2.
select ... into #tmp ...
select ... from #tmp ...



БД большая, некоторые запросы ускорялись в 10 и более раз.темка обсуждения бага сиквела в ветке админов бд есть?
Т.к.лечится временными это жестоко)
...
Рейтинг: 0 / 0
LINQ - проще
    #39748792
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий МухЯ знаю как переписать запрос в стартовом посте не в четыре этажа, а в один, гораздо короче и без оконных функций.
Да, но это будет другой запрос. Даже если он будет возвращать аналогичные результаты.
love_bachпочему я тебя понял, а skyANA начал задавать "уточняющие" вопросы?
Потому, что skyANA, с**а, знал, что так будет.

hVosttskyANAЧто значит тот же самый? Возвращающий аналогичный результат?
да, аналогичный результат при тех же вводных
...
Рейтинг: 0 / 0
LINQ - проще
    #39748793
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttПросто прочитай, что задекларировано в LINQ. А если вот эти Count-ы, будут использовать динамические LINQ выражения, или вообще всё строится на спецификациях? Не всё так просто, как может показаться в лоб.
"Трудно найти в тёмной комнате чёрную кошку... особенно, если её там нет!"

ТС не знал, как написать на SQL то, что ему надо, и написал на LINQ.
Посмотрел сгенерированный текст запроса и понял, что сам бы он скорее поседел, чем додумался до решения на SQL.
Вынес это "достижение" на форум и спалился.

Какие динамические выражения? Какие спецификации? Я тебя умоляю
...
Рейтинг: 0 / 0
LINQ - проще
    #39748857
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAhVosttИли нам не нужны Count-ы в результатах, а как условие для сортировки или фильтрации, м?
Перечитай первое сообщение в топике


Ну я немного шире гляжу на задачу. Понятно, что если чисто в конкретные данные упираться, то да, там типа запрос компактный можно написать, но как это сделать в рамках EF? Не было сказано.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748858
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий МухТС не знал, как написать на SQL то, что ему надо, и написал на LINQ.
Посмотрел сгенерированный текст запроса и понял, что сам бы он скорее поседел, чем додумался до решения на SQL.
Вынес это "достижение" на форум и спалился.

Какие динамические выражения? Какие спецификации? Я тебя умоляю


Ну это не интерсно. На SQL может любой, а как насчёт в EF?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748876
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttДмитрий МухТС не знал, как написать на SQL то, что ему надо, и написал на LINQ.
Посмотрел сгенерированный текст запроса и понял, что сам бы он скорее поседел, чем додумался до решения на SQL.
Вынес это "достижение" на форум и спалился.

Какие динамические выражения? Какие спецификации? Я тебя умоляю


Ну это не интерсно. На SQL может любой, а как насчёт в EF?

Для начала .Sum() вместо .Count() попробовать?
...
Рейтинг: 0 / 0
LINQ - проще
    #39748904
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAДля начала .Sum() вместо .Count() попробовать?

Ну да, а ещё в LINQ можно несколько запросов с одним джойнить, проблема только с outer join.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748920
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Relic Hunter,

Linq определённо крут, если вы понимаете, что будет на выходе и умеете дизайнить базу данных. Потому что в неумелых ручках потом нехилая лажа может возникнуть.

А длинный запрос очень часто бывает более производительным, но не факт, что это относится к данному примеру.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748931
Lessyp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Может вы господа сначала документацию почитаете, прежде чем вываливать на форум всякую бредятину? А то у одного оптимизатор хватает первый план который успел построить за заданное время, у второго проблемы с outer join'ом...
...
Рейтинг: 0 / 0
LINQ - проще
    #39748936
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypМожет вы господа сначала документацию почитаете, прежде чем вываливать на форум всякую бредятину? А то у одного оптимизатор хватает первый план который успел построить за заданное время, у второго проблемы с outer join'ом...

если по сути сказать не способен, вовсе не обязательно тут строить из себя дАртаньяна и позориться.
...
Рейтинг: 0 / 0
LINQ - проще
    #39748976
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
LessypМожет вы господа сначала документацию почитаете
О чём ты? Давай ссылку, фигли
...
Рейтинг: 0 / 0
LINQ - проще
    #39748982
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я пока дам свою:
What Is Optimizer Timeout?SQL Server uses a cost-based query optimizer. Therefore, it selects a query plan with the lowest cost after it has built and examined multiple query plans.
One of the objectives of the SQL Server query optimizer (QO) is to spend a "reasonable time" in query optimization as compared to query execution.
Therefore, QO has a built-in threshold of tasks to consider before it stops the optimization process. If this threshold is reached before QO has considered most, if not all, possible plans then it has reached the Optimizer TimeOut limit.

An event is reported in the query plan as Time Out under "Reason For Early Termination of Statement Optimization." It's important to understand that this threshold isn't based on clock time but on number of possibilities considered.
In current SQL QO versions, over a half million possibilities are considered before a time out is reached.


Optimizer timeout is designed in Microsoft SQL Server and in many cases encountering it is not a factor affecting query performance.
However, in some cases the SQL query plan choice may be affected by optimizer timeout and thus performance could be impacted.

When you encounter such issues, if you understand optimizer timeout mechanism and how complex queries can be affected in SQL Server, it can help you to better troubleshoot and improve your performance issue.
Understanding Optimizer Timeout and how Complex queries can be Affected in SQL Server
...
Рейтинг: 0 / 0
LINQ - проще
    #39749246
Кнюпель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAА во вторых оптимизатор ограничен по времени. Из того, что успел построить, выбрал более подходящий.

да не ограничен он ни по какому времени, он ограничен по количеству планов т.к. их миллиард может быть при множестве джойнов. И само значение этого ограничения не жесткое, а зависит от некоторых артефактов, полученных на предыдущих шагах
Timeout слово неудачное выбрали, хотя для тех, кто дальше linq не понимает - сойдет
...
Рейтинг: 0 / 0
LINQ - проще
    #39749772
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANALessypМожет вы господа сначала документацию почитаете
О чём ты? Давай ссылку, фигли


Нет уж, изволь почитать документацию! Какие ещё ссылки?
...
Рейтинг: 0 / 0
LINQ - проще
    #39749885
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
КнюпельskyANAА во вторых оптимизатор ограничен по времени. Из того, что успел построить, выбрал более подходящий.

да не ограничен он ни по какому времени, он ограничен по количеству планов т.к. их миллиард может быть при множестве джойнов. И само значение этого ограничения не жесткое, а зависит от некоторых артефактов, полученных на предыдущих шагах
Timeout слово неудачное выбрали, хотя для тех, кто дальше linq не понимает - сойдет
Таки дайте ссылку, где вместо reasonable time написано про count. Буду признателен.
...
Рейтинг: 0 / 0
LINQ - проще
    #39749935
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
But I see an Optimizer Timeout with a simpler query?

Nothing with QO is simple (black and white).
There are so many possible scenarios, its complexity so high that it is hard to grasp all of the possibilities.
The Query Optimizer may dynamically adjust/set timeout threshold based on the cost of the plan found at a certain stage.
For example, if a plan that appears relatively "cheap" is found, then the task limit to search for a better plan may be reduced.
Therefore, grossly underestimated cardinality estimation may be one example for hitting an optimizer timeout early.
In this case, the focus of investigation is cardinality estimation. This is a rarer case than the scenario that's discussed previously about running a complex query, but it is possible.
...
Рейтинг: 0 / 0
LINQ - проще
    #39749964
Дмитрий Мух
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TНеоднократно сталкивался с тормозами MSSQL в запросах с подзапросами
Код: sql
1.
select ... from (select ...) ...



Оптимизатор почему-то строил нездоровый план. В итоге лечил временными таблицами
Код: sql
1.
2.
select ... into #tmp ...
select ... from #tmp ...



БД большая, некоторые запросы ускорялись в 10 и более раз.
И про это там тоже есть :)

Re-write the query:
Consider breaking up the single multi-table query into multiple queries by using temporary tables.
However, you shouldn't always do this, breaking up the query is just one of the ways to simplify the task for the optimizer.

See the following sample:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select ...
from t1
join t2
on t1.id = t2.id
join t3
on t3.id = t2.id
join t4
on t4.id = t3.id


To optimize, try to break down into two queries:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
select ...
into #temp1
from t1
join t2
on t1.id = t2.id

select ...
From t3
join #temp1
on t3.id = #temp1.id
join t4
on t4.id = t3.id
...
Рейтинг: 0 / 0
58 сообщений из 58, показаны все 3 страниц
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / LINQ - проще
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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