Я работаю с двумя связанными таблицами в среде Microsoft SQL Server 2008, которые связаны через GUID. В одной таблице поле имеет тип varchar(50)
, а другая правильно набирает как uniqueidentifier
. Это явно плохо, но я не могу это изменить сейчас, потому что это предоставляется устаревшей частью программного обеспечения.
Преобразование, которое SQL Server необходимо выполнять при каждом внутреннем соединении, делает запросы ужасно медленными, поскольку я вообще не могу использовать индексы. Я попытался добавить вычисляемый столбец, который сохраняется, чтобы сохранить идентификатор как uniqueidentifer
. Таким образом я мог бы добавить индекс, чтобы он работал намного быстрее. Я потерпел неудачу.
Кто-нибудь знает, могу ли я сохранить явно преобразованное значение в компьютерном столбце. Если можно, какую формулу здесь использовать?
Ура, Матиас
3 ответа
Это сработало для меня:
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
ПРЕОБРАЗОВАТЬ (uniqueidentifier, your_varchar_here)
Error validating the formula for column 'MyColumn'.
, но тем не менее сохраняет изменения и работает. Странный...
В зависимости от того, как часто вам нужно выполнять преобразование для присоединения, я бы использовал CTE для преобразования типа (ов) данных. Он создается быстрее, чем встроенное представление (следующий лучший временный вариант). В любом случае вы должны предоставить значение как правильный тип данных в столбце результатов из 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.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.