Вопрос

Я работаю с 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top