Почему SYSDATETIME () не меняется при каждом вызове? - PullRequest
0 голосов
/ 06 апреля 2019

Я пытаюсь проанализировать производительность запроса. К сожалению, у меня нет прав на запуск приблизительного или фактического плана запросов для базы данных, которую я читаю. (SHOWPLAN разрешение отклонено в базе данных)

Я переписал исходный запрос, но хотел бы сравнить время выполнения для исходного запроса и двух моих запросов. Для этого я решил создать 4 переменные datetime2 и записать SYSDATETIME() между каждой итерацией, а затем найти разницу.

К сожалению, я обнаружил, что однажды вызванный, SYSDATETIME() не обновляется.

Всего мои 3 запроса выполняются за 17 секунд. Между каждым выполнением я должен видеть, как меняется отметка времени, но переменные каждый раз записывают одну и ту же отметку времени.

declare @a datetime2, @b datetime2, @c datetime2, @d datetime2

set @a = SYSDATETIME()

select bunch of columns from a bunch of joined tables

set @b = SYSDATETIME()

select bunch of columns and sub-queries from a bunch of tables joined a little differently

set @c = SYSDATETIME()

select bunch of columns and sub-queries from a bunch of differently joined tables and sub-queries

set @d = SYSDATETIME()

print @a
print @b
print @c
print @d

Все 4 переменные имеют одинаковое значение.

a   2019-04-05 16:00:09.3947421 
b   2019-04-05 16:00:09.3947421 
c   2019-04-05 16:00:09.3947421 
d   2019-04-05 16:00:09.3947421

Общее время выполнения составило 19 секунд, поэтому для проверки должны быть действительные данные.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 10 апреля 2019

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

Все еще не знаю, почему SYSDATETIME не возвращает истинное значение при каждом вызове. Может быть, SQL-сервер пытается помочь.

К вашему сведению, из этого rtrim (ltrim (FIELD))) быстрее, чем FIELD, как «A%», что быстрее, чем FIELD = 'A', когда FIELD имеет тип char (10).

0 голосов
/ 06 апреля 2019

Весь запрос, вероятно, запускается сразу.

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

declare @a datetime2 = SYSDATETIME()
print @a

go

select bunch of columns from a bunch of joined tables
declare @b datetime2 = SYSDATETIME()
print @b

go

select bunch of columns and sub-queries from a bunch of tables joined a little differently
DECLARE @c datetime2 = SYSDATETIME()
print @c

go

select bunch of columns and sub-queries from a bunch of differently joined tables and sub-queries
declare @d datetime2 = SYSDATETIME()
print @d

go
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...