Как найти самые медленные запросы

Вы хотите, чтобы ваши x применялись случайным образом или были детерминированными?

Случайный вариант:

Если вы хотите, чтобы x также был случайным, вы можете просто сгенерируйте случайное значение:

int percent = ThreadLocalRandom.current().nextInt(1, 100);
if (percent < x) {
    // ...get the actual random value.
}

percent должно быть между 1 и 100, поэтому у вас есть ровно 100 возможных значений. Если вы включите 0, у вас есть 101. Затем вы делаете свою проверку процента. Если процент находится снаружи (больше чем) x, x был слишком мал. Следовательно, вы получаете false, в противном случае - true. Оттуда вы можете работать с if -условием.

Детерминированный вариант:

Если детерминирован, это зависит от вашего предпочтительного поведения. Например, вы можете использовать счетчик, и каждый раз, когда вы превышаете 100, вы «ломаетесь» и возвращаете истину:

// object attribute.
private Integer accumulator = 0;

// in method (should be synchronized, at least on accumulator, if you use multithreading):
accumulator += x;
boolean overflow = false;
if (accumulator >= 100) {
    overflow = true;
    accumulator %= 100; // this applies modulo 100 to accumulator.
}

if (overflow) {
    // ...get the actual random value.
}

При этом вы получите ровно x процентов от true с, чем больше вы называете свой метод. В начале у вас ничего не будет, если не считать 100%, но со временем точность возрастает.

54
задан KM. 4 May 2009 в 02:57
поделиться

3 ответа

В SQL 2005 вы можете использовать представления управления для поиска медленно выполняющихся запросов. Хороший сценарий, который я недавно обнаружил для производительности SQL-сервера поможет вам начать работу, в нем будут перечислены данные с самыми низкими показателями.

SELECT  creation_time 
        ,last_execution_time
        ,total_physical_reads
        ,total_logical_reads 
        ,total_logical_writes
        , execution_count
        , total_worker_time
        , total_elapsed_time
        , total_elapsed_time / execution_count avg_elapsed_time
        ,SUBSTRING(st.text, (qs.statement_start_offset/2) + 1,
         ((CASE statement_end_offset
          WHEN -1 THEN DATALENGTH(st.text)
          ELSE qs.statement_end_offset END
            - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
ORDER BY total_elapsed_time / execution_count DESC;
97
ответ дан 7 November 2019 в 07:54
поделиться

Прежде чем использовать профилировщик, я проверяю встроенные отчеты об использовании. Щелкните правой кнопкой мыши базу данных, Отчеты, Стандартные отчеты, затем Статистика выполнения объектов.

В нем перечислены текущие кэшированные планы выполнения, а также количество ресурсов и количество выполненных ими операций. Как правило, это дает очень хорошее представление о том, чем занят сервер.

12
ответ дан 7 November 2019 в 07:54
поделиться

Столбец длительности делает это для меня, но иногда я смотрю и на столбцы для чтения и записи.

Я использую фильтр TSQL: StmtCompleted для получения необработанных запросов. Возможно, вы захотите добавить к этому другие хранимые процедуры, но tsql - это «база», которую вам нужно просмотреть. Как говорится в статье MSDN

: «Выполнение хранимой процедуры может контролироваться SP: начиная, SP: StmtStarting, SP: StmtCompleted и SP: Завершенные классы событий и все Классы событий TSQL. "

4
ответ дан 7 November 2019 в 07:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: