Добрый день. Есть запрос. Если написать в yii2 время выполнение запроса будет 1315.1 ms Если в SSMS то затраченное время = 199 мс. Сам запрос: PHP: $sql = "SELECT ((SUM(CASEWHEN tb1.[Amount] ISNOTNULLTHEN ( tb1.[Amount] ) ELSE (0) END ) +SUM(tb1.[status])) * tb1.[SocketsCount]) AS [status] FROM( SELECT IPR.[Amount], STD.[SocketsCount] ,COALESCE ( SUM (CASEWHEN IJ.[Oid] ISNULLTHEN ( RF.[Status] ) ELSE (0) END),(0)) AS [status] FROM [EAM_test].[dbo].[MESShiftTask] AS [ST] LEFT JOIN [EAM_test].[dbo].[MESShiftTaskData] AS STD ON STD.[ShiftTask] = ST.[Oid] AND [RepairObject] = '{$tpa}' LEFT JOIN [EAM_test].[dbo].[RFIDReader] AS RR ON STD.[RepairObject] = RR.[Asset] AND RR.[Active] =1 LEFT JOIN [EAM_test].[dbo].[RFIDData] AS [RF] ON RF.[Reader] = RR.[Oid] LEFT JOIN [EAM_test].[dbo].[MESIdleJournal] AS IJ ON IJ.[RepairObject] = STD.[RepairObject] AND [IdleType] =1 AND (IJ.[StartDate] > STD.[ProductionStart]) AND RF.[Date] BETWEEN IJ.[StartDate] ANDISNULL(IJ.[EndDate], STD.[ProductionEnd]) LEFT JOIN [EAM_test].[dbo].[MESIdleProducts] AS IPR ON IPR.[IdleJournal] = IJ.[Oid] WHERE ST.[TaskDate] = '{$date}' AND ST.[ShiftType] = {$shiftType} AND (RF.[Date] BETWEEN STD.[ProductionStart] AND STD.[ProductionEnd] OR RF.[Status] =0) AND STD.[TaskStatus] ISNOTNULL GROUP BY IPR.[Amount], STD.[SocketsCount] ) AS tb1 GROUP BY tb1.[SocketsCount]"; $result = Yii::$app->db->createCommand($sql)->queryScalar(); return $result; Что не делаю не так? У меня 37 запросов к бд, в сумме занимают 3 секунды. Из которых он один 1.3 секунды. Почему так?
я раньше все время пытался писать такие запросы)) потом начал писать вместо одного большого 5-6 мелких)) попробуйте его подробить.. может лучше станет.. плюс будет лучше видно где какие индексы лучше использовать..
@Artur_hopf, значит, до вашего SSMS данные доходят быстрее чем до веб-сервера, на котором крутится yii.
@Artur_hopf, я же всю картину не вижу. Но по логике вещей похоже. Вебсервер на одном компе с базой сейчас? --- Добавлено --- Попробуйте на голом PDO тоже самое, кстати.
Да, это тестовая у меня. Сейчас попробую --- Добавлено --- PHP: $start = microtime(true); $stmt = sqlsrv_query( $conn, $sql ); $result = []; if( $stmt !== false ) { while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC ) ) { $result[] = $row; } sqlsrv_free_stmt( $stmt ); } sqlsrv_close( $conn ); print_r($result); echo '<br> Скрипт был выполнен за ' . (microtime(true) - $start) . " секунд"; одинаково с yii --- Добавлено --- на рабочий сервер скинул, там все быстрее но есть один нюанс, там все запросы занимают 1,5 секунды. Из которых этот 700ms. Это фиаско
На локальном никакой нагрузки нет. Ты один. Сервер уже другая "фича". Что угодно может быть - различие версий, индексы, количество записей в таблице и т.п. Надо все учитывать и проверять. ------------- Я тоже не понимал, почему у меня на локальном нормально работает, а на сервере спустя неделю плохо. Оказалось, что в логах собралось уже лям записей, а кое-где в запросе тупо отсутствовали нужные индексы. Добавил индекс и вуаля, все летает.
В общем дело было в оптимизации запроса. День потратил, прокачал SQL навыки, пролучил LvlUp В итоге вместо Получаем 473/249 ms и 230.1/33.3 ms тот запрос. Такая разбежка видимо из за логов, но это фигня =)