Я работаю с двумя связанными таблицами в среде Microsoft SQL Server 2008, которые связаны через GUID. В одной таблице поле имеет тип varchar(50), а другая правильно набирает как uniqueidentifier. Это явно плохо, но я не могу это изменить сейчас, потому что это предоставляется устаревшей частью программного обеспечения.

Преобразование, которое SQL Server необходимо выполнять при каждом внутреннем соединении, делает запросы ужасно медленными, поскольку я вообще не могу использовать индексы. Я попытался добавить вычисляемый столбец, который сохраняется, чтобы сохранить идентификатор как uniqueidentifer. Таким образом я мог бы добавить индекс, чтобы он работал намного быстрее. Я потерпел неудачу.

Кто-нибудь знает, могу ли я сохранить явно преобразованное значение в компьютерном столбце. Если можно, какую формулу здесь использовать?

Ура, Матиас

0
Matthias Meid 18 Авг 2009 в 18:17

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
3
Quassnoi 18 Авг 2009 в 18:24
Спасибо, отлично работает. Запрос занимает 4 секунды вместо получаса сейчас. :)
 – 
Matthias Meid
18 Авг 2009 в 18:51

ПРЕОБРАЗОВАТЬ (uniqueidentifier, your_varchar_here)

1
KM. 18 Авг 2009 в 18:24
Работает хорошо. Management Studio говорит Error validating the formula for column 'MyColumn'., но тем не менее сохраняет изменения и работает. Странный...
 – 
Matthias Meid
18 Авг 2009 в 18:50

В зависимости от того, как часто вам нужно выполнять преобразование для присоединения, я бы использовал 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.

1
OMG Ponies 18 Авг 2009 в 18:45