У меня есть таблица со столбцом xml с именем Data:
CREATE TABLE [dbo].[Users](
[UserId] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [nvarchar](max) NOT NULL,
[LastName] [nvarchar](max) NOT NULL,
[Email] [nvarchar](250) NOT NULL,
[Password] [nvarchar](max) NULL,
[UserName] [nvarchar](250) NOT NULL,
[LanguageId] [int] NOT NULL,
[Data] [xml] NULL,
[IsDeleted] [bit] NOT NULL,...
В столбце данных есть этот xml
<data>
<RRN>...</RRN>
<DateOfBirth>...</DateOfBirth>
<Gender>...</Gender>
</data>
Теперь, выполняя этот запрос:
SELECT UserId FROM Users
WHERE data.value('(/data/RRN)[1]', 'nvarchar(max)') = @RRN
после очистки кеша берет (если я выполню его пару раз друг за другом) 910, 739, 630, 635, ... мс.
Теперь специалист по БД сказал мне, что добавление функции, представления и изменения запроса значительно ускорит поиск пользователя с данным RRN. Но вместо этого это результаты, которые я выполняю с изменениями специалиста по БД: 2584, 2342, 2322, 2383, ...
Это добавленная функция:
CREATE FUNCTION dbo.fn_Users_RRN(@data xml)
RETURNS nvarchar(100)
WITH SCHEMABINDING
AS
BEGIN
RETURN @data.value('(/data/RRN)[1]', 'varchar(max)');
END;
Добавлен вид:
CREATE VIEW vwi_Users
WITH SCHEMABINDING
AS
SELECT UserId, dbo.fn_Users_RRN(Data) AS RRN from dbo.Users
Индексы:
CREATE UNIQUE CLUSTERED INDEX cx_vwi_Users ON vwi_Users(UserId)
CREATE NONCLUSTERED INDEX cx_vwi_Users__RRN ON vwi_Users(RRN)
А затем измененный запрос:
SELECT UserId FROM Users
WHERE dbo.fn_Users_RRN(Data) = @RRN
Почему решение с функцией и представлением работает медленнее?