Р
Size: a a a
Р
I
MC
create table dbo.ORDERS (ID int, ENABLED int, [CREATIONDATETIME] float, [CLIENTID] float,
[WORKNAME] varchar(100),[WORKPHONE] varchar(100),[FRIEND] varchar(100),[INFO] varchar(100),[ADULTINFO] varchar(100),[WORKHEADMEN] varchar(100)
);
CREATE NONCLUSTERED INDEX [_dta_index_ORDERS_7_1540200537__K19_K6_K18_K1_7_9_16_34_62_63] ON [dbo].[ORDERS]
(
[CLIENTID] ASC,
[ENABLED] ASC,
[CREATIONDATETIME] ASC,
[ID] ASC
)
INCLUDE([WORKNAME],[WORKPHONE],[FRIEND],[INFO],[ADULTINFO],[WORKHEADMEN]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) ON [PRIMARY]
GO
Говорю разработчикам на работе: использовать функции применительно к столбцам в WHERE нельзя, это может привести к сканированию индекса вместо быстрого поиска. На что мне кидают пример запроса по этой таблице:select o.id from orders o- 2 секунды
where convert(datetime, o.CREATIONDATETIME -2)>= '20201020'
select o.id from orders o- 1 минута.
where creationdatetime >= dbo.DateStrToDate('2020-10-20')
DateStrToDate- CLR функция, которая превращает текст в тип float.
_dta_index_ORDERS_7_1540200537__K19_K6_K18_K1_7_9_16_34_62_63, только во втором плане дополнительным шагом идёт итератор FILTER со стоимостью 5%. Статистика по индексу была обновлена перед выполнением запроса, фрагментация - 22%, строк в таблице - 7 млн, значения creationdatetimeидут с 2012 года по текущий день, с уплотнением начиная с 2018 года. Почему время выполнения двух запросов насколько разное?
MC

M
create table dbo.ORDERS (ID int, ENABLED int, [CREATIONDATETIME] float, [CLIENTID] float,
[WORKNAME] varchar(100),[WORKPHONE] varchar(100),[FRIEND] varchar(100),[INFO] varchar(100),[ADULTINFO] varchar(100),[WORKHEADMEN] varchar(100)
);
CREATE NONCLUSTERED INDEX [_dta_index_ORDERS_7_1540200537__K19_K6_K18_K1_7_9_16_34_62_63] ON [dbo].[ORDERS]
(
[CLIENTID] ASC,
[ENABLED] ASC,
[CREATIONDATETIME] ASC,
[ID] ASC
)
INCLUDE([WORKNAME],[WORKPHONE],[FRIEND],[INFO],[ADULTINFO],[WORKHEADMEN]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 95) ON [PRIMARY]
GO
Говорю разработчикам на работе: использовать функции применительно к столбцам в WHERE нельзя, это может привести к сканированию индекса вместо быстрого поиска. На что мне кидают пример запроса по этой таблице:select o.id from orders o- 2 секунды
where convert(datetime, o.CREATIONDATETIME -2)>= '20201020'
select o.id from orders o- 1 минута.
where creationdatetime >= dbo.DateStrToDate('2020-10-20')
DateStrToDate- CLR функция, которая превращает текст в тип float.
_dta_index_ORDERS_7_1540200537__K19_K6_K18_K1_7_9_16_34_62_63, только во втором плане дополнительным шагом идёт итератор FILTER со стоимостью 5%. Статистика по индексу была обновлена перед выполнением запроса, фрагментация - 22%, строк в таблице - 7 млн, значения creationdatetimeидут с 2012 года по текущий день, с уплотнением начиная с 2018 года. Почему время выполнения двух запросов насколько разное?
MC
ALTER FUNCTION [dbo].[DateStrToDate](@dateStr [nvarchar](4000))один аргумент - одно значение, функция простая внутри medInfodll и детерминированная. Время работы с одним аргументом - меньше секунды
RETURNS [float] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [medInfodll].[UserDefinedFunctions].[DateStrToDate]
M
ALTER FUNCTION [dbo].[DateStrToDate](@dateStr [nvarchar](4000))один аргумент - одно значение, функция простая внутри medInfodll и детерминированная. Время работы с одним аргументом - меньше секунды
RETURNS [float] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [medInfodll].[UserDefinedFunctions].[DateStrToDate]
MC
MC
M
MC
M
О奧
ALTER FUNCTION [dbo].[DateStrToDate](@dateStr [nvarchar](4000))один аргумент - одно значение, функция простая внутри medInfodll и детерминированная. Время работы с одним аргументом - меньше секунды
RETURNS [float] WITH EXECUTE AS CALLER
AS
EXTERNAL NAME [medInfodll].[UserDefinedFunctions].[DateStrToDate]
О奧
MC
MC
M
M
MC

AC
SELECTА этот запрос что возвращает? Детерминированная UDF должна быть schemabinding вроде как
OBJECTPROPERTYEX(OBJECT_ID('dbo.DateStrToDate'), 'IsDeterministic') as IsDeterministic,
OBJECTPROPERTYEX(OBJECT_ID('dbo.DateStrToDate'), 'SystemDataAccess') as SystemDataAccess,
OBJECTPROPERTYEX(OBJECT_ID('dbo.DateStrToDate'), 'UserDataAccess') as UserDataAccess