Преобразование типа в Сохраняемом Вычисляемом столбце
-
18-09-2019 - |
Вопрос
Я работаю с 2 связанными таблицами в среде Microsoft SQL Server 2008, которые подключены через GUID.В одной таблице поле имеет тип varchar(50)
, другой правильно печатается как uniqueidentifier
.Это, очевидно, плохо, но я не могу изменить это сейчас, потому что это задано устаревшим программным обеспечением.
Преобразование, которое SQL Server должен выполнять при каждом внутреннем соединении, приводит к тому, что запросы выполняются ужасно медленно, поскольку я вообще не могу использовать индексы.Я попытался добавить вычисляемый столбец, который сохраняется, чтобы получить идентификатор, сохраненный как uniqueidentifer
.Таким образом, я мог бы добавить индекс, чтобы, вероятно, заставить его работать намного быстрее.Я потерпел неудачу.
Кто-нибудь знает, могу ли я сохранить явно преобразованное значение в столбце computer .Если я могу, какую формулу здесь использовать?
Приветствия, Маттиас
Решение
Это сработало для меня:
CREATE TABLE t_uuid (charid VARCHAR(50) NOT NULL, uuid AS CAST(charid AS UNIQUEIDENTIFIER))
CREATE INDEX IX_uuid_uuid ON t_uuid (uuid)
INSERT
INTO t_uuid (charid)
VALUES (NEWID())
SELECT *
FROM t_uuid
Другие советы
КОНВЕРТИРОВАТЬ (уникальный идентификатор, your_varchar_here)
В зависимости от того, как часто вам нужно производить преобразование для присоединения, я бы использовал CTE чтобы преобразовать тип (ы) данных.Он создается быстрее, чем встроенное представление (следующий лучший временный вариант).В любом случае вы должны указать value как правильный тип данных в столбце результатов из CTE / встроенного представления, чтобы вы могли ПРИСОЕДИНИТЬСЯ к нему.Пример CTE:
WITH example AS (
SELECT t.guid
CONVERT(UniqueIdentifier, t.guid) 'cguid'
FROM TABLE t)
SELECT t.*
FROM TABLE t
JOIN example e ON e.cguid = t.guid
Пример встроенного просмотра:
SELECT t.*
FROM TABLE t
JOIN (SELECT t.guid
CONVERT(UniqueIdentifier, t.guid) 'cguid'
FROM TABLE t) e ON e.cguid = t.guid
Невозможно обойти тот факт, что индекс для guid (при условии, что он есть) использоваться не будет, но также не рекомендуется выполнять преобразование типов данных в предложении WHERE.