Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 JOIN по вычисляемому полю  [new]
Филипп Вульфович
Member

Откуда:
Сообщений: 47
Здравствуйте!

Нет ли каких-нибудь замеченных траблов SQL Servera, связанных с JOINами таблиц по вычисляемому полю.

Нам нужно сделать исправление в основных хранимках нашей системы, относящихся к уровню "ядра".

Т.е. заменить JOIN по обычному полю, на JOIN по вычисляемому.

На что это может повлиять, я имею ввиду не изменения логики запросов,
а такие факторы

1) Быстродействие
2) Потенциальная глючность (если замечена)
3 июл 12, 20:40    [12812301]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Филипп Вульфович,

Что мешает проверить самостоятельно?
3 июл 12, 21:01    [12812363]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
Филипп Вульфович
Member

Откуда:
Сообщений: 47
invm,

Я прежде всего спрашиваю о каких-либо скрытых вилах, на которые
сразу не наткнешься.
4 июл 12, 22:41    [12819221]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
Ray D
Member

Откуда: from the middle of nowhere
Сообщений: 3598
Блог
пример того, что собираетесь сделать, можете показать?
5 июл 12, 00:22    [12819564]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Филипп Вульфович
спрашиваю о каких-либо скрытых вилах
Вагон и маленькая тележка. Под соусом нескольких факторов, аля PERSISTED или нет.
5 июл 12, 01:18    [12819661]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
Филипп Вульфович
Member

Откуда:
Сообщений: 47
Mnior,

У нас есть таблицы Result - результаты, Test - тесты

В таблице Result есть поля Test, Hidden

Result (Test) -> Test (ID)

Сейчас хотим сделать новое поле TestID, а старое

Test сделать вычисляемым (PERSISTED) по формуле CASE WHEN Hidden=1 THEN TestID END

Поле Test использовалось в огромном количестве хранимок, которые переделывать очень сложно.

Новые запросы будут записывать в поле TestID и работать с этим полем,
а со старыми хранимками будет обеспечена совместимость.

В этих хранимках использовались JOIN по полю Test.

Пример куска хранимки

...
(SELECT     
  dbo.Dog.id AS DogId, 
  dbo.Dog.PID, dbo.Result.id, dbo.Test.FullName, 
  dbo.Test.Pos, 1 AS Количество, 
  dbo.Dog.Organization, 
  dbo.Test.Lab AS Группа, 
  dbo.Result.Status
FROM  
  dbo.Dog 
    INNER JOIN dbo.Result ON dbo.Dog.id = dbo.Result.Dogovor 
    INNER JOIN dbo.Test ON dbo.Result.Test = dbo.Test.id
WHERE     
  (dbo.Result.Otkaz IS NULL) and (dbo.Dog.[Data]>= @dt1 and dbo.Dog.[Data]< @dt2)
...
6 июл 12, 12:58    [12828121]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Филипп Вульфович
Сейчас хотим сделать новое поле TestID, а старое
Test сделать вычисляемым (PERSISTED) по формуле CASE WHEN Hidden=1 THEN TestID END
Чую что решение было сделано за 3 секунды, а реализация пока в тумане (неделями). Такого не должно быть.
В решениях (как надо сделать) заключается всё, т.е. видятся N разных полноценных(!) решения и далее делается выбор. Решений должны быто много - точнее все технически возможные (иначе большая вероятность сделать неоправданно плохое решение).

Совершенно не пойму почему мыслится такими категориями. Да и вообще непонятно зачем этот CASE:
- оно играет роль фильтра?
- или Hidden глупо эмулирует Test = NULL?
Может лучше делать по другому.

Для тех кто не понел. Филипп Вульфович, хочет из обычного поля сделать вычисляемое. Т.е. ему уже UPDATE не сделать. А коль такое допустимо, то в голову приходят много других вариантов.
На VIEW вы, Филипп Вульфович, почему не смотрите. Религия? Патерны проэктирования знать обязательно.

Не думаю что на таких простых и косвенных запросах будут грабли, если конечно поле будет PERSISTED (это обязательно). Т.е решение хуже чем с VIEW.

И откоройте для себя алиасы наконец (если вы перейдёте на новый сервер/клиент, у вас может всё вывалится, да к тому же простыня кода нечитабельна).
Филипп Вульфович
а со старыми хранимками будет обеспечена совместимость.
Неподъёмный код, да? Большой програмный(технический) долг замучал?
6 июл 12, 19:59    [12831261]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
Филипп Вульфович
Member

Откуда:
Сообщений: 47
С сожалению, Вы так и не предложили никакой альтернативы решения нашей проблемы.
Пожалуйста, поясните, что Вы имели ввиду под испольниванием VIEW.

Вы общаетесь со мною так, как будто я уже вам давно знаком и позволяете себе не совсем вежливые формулировки.
Прошу вас, если Вы беретесь отвечать на вопрос и берете на себя планку профи,
сохранять вежливость и уважение, а в своих идеях четкость.

Со своей стороны я приведу кое-какие детали, которые я опустил, думая, что они несущественны.

Хранимок, использующих таблицу Test примерно 258.

Делать массовый апдейт хранимок без соответствующего тестирования - опасно.

Времени на тестирование практически уже нет. Послезавтра нужно решение.

Соответственно нам нужно
сделать так,

чтобы часть записей таблицы Test было скрыто из старых хранимок.

Для этого вводится поле Hidden. А поле Test становится вычисляемым (PERSISTED), принимая значение Null там, где Hidden=1

Мы это уже проделали на копии базы данных. Работает так, как хотели.

Но возникает вопрос, не будет ли каких-либо подводных камней. Например, спрашиваю
о наличии "известных глюков" Persisted полей. Замечены или нет?
18 июл 12, 15:50    [12884122]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
hoha_ftf
Member

Откуда: ЕКБ
Сообщений: 42
Филипп Вульфович,

Если вы собираетесь делать join, то, скорее всего, вычисляемое поле будет проиндексировано.И тут начинаются грабли.
Процедуры, работающие с таблицей, должны быть созданы с quoted_identifier on. Иначе создание новых процедур будет вываливаться с ошибкой, а старые не будут использовать индекс и уйдут в скан таблицы.
Подробно тут.
Про другие настройки можно найти в msdn
18 июл 12, 19:19    [12885361]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
Филипп Вульфович
Member

Откуда:
Сообщений: 47
Спасибо огромное за ценную информацию!!!
18 июл 12, 20:26    [12885533]     Ответить | Цитировать Сообщить модератору
 Re: JOIN по вычисляемому полю  [new]
step_ks
Member

Откуда:
Сообщений: 936
Филипп Вульфович
Пожалуйста, поясните, что Вы имели ввиду под испольниванием VIEW.

Таблица Result переименовывается любым способом в, например, Results.
Далее
create view Result 
as 
select Test,...
   from Results
   where Hidden=0

Потом, если надо, потихоньку и спокойно правите старые хранимки и избавляетесь от view.
18 июл 12, 21:43    [12885684]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить