SQL Просмотр: оптимизация данных в реальном времени - PullRequest
1 голос
/ 11 февраля 2020

У меня возникла проблема с запросом.

Сценарий таков: у меня есть показатель эффективности c, который заполняется в представлении, принимая входные данные из другого представления. Этот расчет использует GETUTCDATE(), и я просто корректирую свой часовой пояс. Я рассчитываю эффективность, используя значение столбца «BuildTime» в зависимости от того, сколько времени прошло с 7:00 утра текущего дня (например, если с 7:00 прошло 120 минут, а «BuildTime» равно 120 минутам, эффективность равна 100%). Я также использую функцию CASE, чтобы вычислять только текущее время между часами работы (7:00 - 15:30)

Ниже приведен код:

SELECT
    md.Operator,

    CASE 
    WHEN DATEADD(HOUR, -6, GETUTCDATE()) > CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '7:00' AND GETDATE() < CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '15:30' THEN
    (SUM(isNull(md.TotalTime, 0)) + SUM(isNull(md.DelTime, 0))) * 1.0 / DATEDIFF(MINUTE, CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '7:00' , DATEADD(HOUR, -6, GETUTCDATE())) * 100.0
    ELSE (SUM(isNull(md.TotalTime, 0)) + SUM(isNull(md.DelTime, 0))) / 435 * 100.0
    END
    AS OpEfficiency


FROM [Booms MES Master Data] as md
WHERE md.[Date] = CONVERT(varchar(50), DATEADD(HOUR, -6, GETUTCDATE()), 101)
GROUP BY md.Operator

На данный момент Этот код занимает несколько секунд для запуска. Мне интересно, где проблема лежит в коде? Я преобразовываю слишком много операторов или это проблема с вложенной функцией if?

1 Ответ

0 голосов
/ 12 февраля 2020

Если у вас очень большой набор данных, как правило, начните сначала с фиксированного значения и ограничьте конверсию минимальным количеством символов. В этом случае varchar (10), так как дата в формате 101 имеет только 10 символов ('12 / 12/1234 ').

WHERE CONVERT(varchar(10), DATEADD(HOUR, -6, GETUTCDATE()), 101) = md.[Date]

Вы можете использовать Microsoft Анализ фактического плана выполнения для выявления дальнейших проблем.

https://docs.microsoft.com/en-us/sql/relational-databases/performance/analyze-an-actual-execution-plan

Также рассмотрите возможность преобразования в даты вместо varchar, если ваш код работает на sql server 2012+. Даты хранятся в виде двух целых чисел на сервере sql. sql гораздо проще найти указанный номер c после сортировки, чем поиск строки, отсортированной по мм / дд / гг, если у вас есть данные за несколько лет.

WHERE CONVERT(date, DATEADD(HOUR, -6, GETUTCDATE())) = CONVERT(date,md.[Date])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...