У меня таблица с очень большим трафиком с полем char(50)
, которое участвует в нескольких индексах. Это поле char(50)
допускает NULLS, и в этом случае значение NULL считается таким же, как и строка, не равная NULL, для моей цели.
Я также игнорирую начальные и конечные пробелы и, хотя я очищаю данные перед тем, как вставить их, они также могут быть вставлены не зависящими от меня средствами.
У меня есть sproc, который используется для копирования данных из одной таблицы в основную таблицу, и он должен быть высокопроизводительным. Мне нужно удалить дубликаты записей перед вставкой новых данных, и я использую метод, описанный в этой теме , чтобы выполнить удаление.
Мой оператор удаления выглядит так (упрощенно):
delete masterTable
from masterTable t
join incomingDataTable inc on
(
LTRIM(RTRIM(COALESCE(inc.TextField,''))) =
LTRIM(RTRIM(COALESCE(t.TextField,'')))
)
where LTRIM(RTRIM(COALESCE(t.TextField,''))) <> ''
Я прочитал , что конструкции типа LTRIM (RTRIM (...)) плохие. Может ли мой оператор удаления быть улучшен, и если да, то как?
РЕДАКТИРОВАТЬ: Просто чтобы уточнить, TextField
принимает участие в индексах в обеих таблицах.
EDIT2: TextField
определяется как char(50)
в обеих таблицах. Это не тип TEXT
.