За последние 24 часа нас посетили 22529 программистов и 1138 роботов. Сейчас ищут 628 программистов ...

Почему разное выполнение одного и того же запроса?

Тема в разделе "Yii", создана пользователем Artur_hopf, 19 ноя 2019.

  1. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Добрый день.
    Есть запрос. Если написать в yii2 время выполнение запроса будет 1315.1 ms
    Если в SSMS то затраченное время = 199 мс.

    Сам запрос:
    PHP:
    1. $sql = "SELECT ((SUM(CASEWHEN tb1.[Amount] ISNOTNULLTHEN ( tb1.[Amount] ) ELSE (0) END ) +SUM(tb1.[status])) * tb1.[SocketsCount]) AS [status]
    2. FROM(
    3. SELECT IPR.[Amount], STD.[SocketsCount]
    4. ,COALESCE ( SUM (CASEWHEN IJ.[Oid] ISNULLTHEN ( RF.[Status] ) ELSE (0) END),(0)) AS [status]
    5. FROM [EAM_test].[dbo].[MESShiftTask] AS [ST]
    6. LEFT JOIN [EAM_test].[dbo].[MESShiftTaskData] AS STD ON STD.[ShiftTask] = ST.[Oid]
    7. AND [RepairObject] = '{$tpa}'
    8. LEFT JOIN [EAM_test].[dbo].[RFIDReader] AS RR ON STD.[RepairObject] = RR.[Asset] AND RR.[Active] =1
    9. LEFT JOIN [EAM_test].[dbo].[RFIDData] AS [RF] ON RF.[Reader] = RR.[Oid]
    10. LEFT JOIN [EAM_test].[dbo].[MESIdleJournal] AS IJ ON IJ.[RepairObject] = STD.[RepairObject]
    11. AND [IdleType] =1
    12. AND (IJ.[StartDate] > STD.[ProductionStart])
    13. AND RF.[Date] BETWEEN IJ.[StartDate]
    14. ANDISNULL(IJ.[EndDate], STD.[ProductionEnd])
    15. LEFT JOIN [EAM_test].[dbo].[MESIdleProducts] AS IPR ON IPR.[IdleJournal] = IJ.[Oid]
    16. WHERE ST.[TaskDate] = '{$date}'
    17. AND ST.[ShiftType] = {$shiftType}
    18. AND (RF.[Date] BETWEEN STD.[ProductionStart] AND STD.[ProductionEnd] OR RF.[Status] =0)
    19. AND STD.[TaskStatus] ISNOTNULL
    20. GROUP BY IPR.[Amount], STD.[SocketsCount]
    21. ) AS tb1
    22. GROUP BY tb1.[SocketsCount]";
    23.  
    24. $result = Yii::$app->db->createCommand($sql)->queryScalar();
    25. return $result;
    Что не делаю не так? xxxcxww.jpg

    У меня 37 запросов к бд, в сумме занимают 3 секунды. Из которых он один 1.3 секунды. Почему так?
     
  2. Алекс8

    Алекс8 Активный пользователь

    С нами с:
    18 май 2017
    Сообщения:
    1.730
    Симпатии:
    359
    я раньше все время пытался писать такие запросы)) потом начал писать вместо одного большого 5-6 мелких))
    попробуйте его подробить.. может лучше станет.. плюс будет лучше видно где какие индексы лучше использовать..
     
    Artur_hopf нравится это.
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @Artur_hopf, значит, до вашего SSMS данные доходят быстрее чем до веб-сервера, на котором крутится yii.
     
    Artur_hopf нравится это.
  4. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    @mkramer IIS виноват значит?
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    @Artur_hopf, я же всю картину не вижу. Но по логике вещей похоже. Вебсервер на одном компе с базой сейчас?
    --- Добавлено ---
    Попробуйте на голом PDO тоже самое, кстати.
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    Да, это тестовая у меня. Сейчас попробую
    --- Добавлено ---
    PHP:
    1. $start = microtime(true);
    2.  
    3. $stmt = sqlsrv_query( $conn, $sql );
    4.  
    5. $result = [];
    6.  
    7. if( $stmt !== false )
    8. {
    9.     while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC ) )
    10.     {
    11.         $result[] = $row;
    12.     }
    13.  
    14.     sqlsrv_free_stmt( $stmt );
    15. }
    16.  
    17. sqlsrv_close( $conn );
    18.  
    19. print_r($result);
    20.  
    21. echo '<br> Скрипт был выполнен за ' . (microtime(true) - $start) . " секунд";
    одинаково с yii
    --- Добавлено ---
    на рабочий сервер скинул, там все быстрее
    11111.jpg
    но есть один нюанс, там все запросы занимают 1,5 секунды. Из которых этот 700ms. Это фиаско :(
     
  7. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    На локальном никакой нагрузки нет. Ты один.
    Сервер уже другая "фича".

    Что угодно может быть - различие версий, индексы, количество записей в таблице и т.п.
    Надо все учитывать и проверять.


    -------------

    Я тоже не понимал, почему у меня на локальном нормально работает, а на сервере спустя неделю плохо.
    Оказалось, что в логах собралось уже лям записей, а кое-где в запросе тупо отсутствовали нужные индексы.
    Добавил индекс и вуаля, все летает.
     
  8. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    В общем дело было в оптимизации запроса. День потратил, прокачал SQL навыки, пролучил LvlUp

    В итоге вместо
    Получаем 473/249 ms и 230.1/33.3 ms тот запрос.
    Такая разбежка видимо из за логов, но это фигня =)
    000.jpg