В начале был один набор таблиц для всех третьих сторон и дб был хорош .... потом ...Would кратно повторяется СУЩЕСТВУЕТ заявления, которые находятся в нескольких соединенных с видом получить оптимизированный в SQL Server
Один из наши сторонние стороны нуждались в некоторых из своих данных, поэтому, чтобы скрыть все остальные решения для клиентских данных, нужно было создать еще один набор таблиц (!!!), где мы будем дублировать данные только для этой третьей стороны и предоставлять доступ только к их набору зеркальных столы .... пока другой третья сторона не попросила того же ... а затем еще ... а затем я вошел ...
ATM Я подумываю о введении набора Views
на третью сторону, которая сидит в своей третьей стороне Schema
и делать подвыборы из исходных таблиц ... Чтобы определить в новом Views
, который записывает, чтобы показать, кому я планирую представить таблицу RecordOwner
. Где бы у меня были столбцы PK и owner для записей, которые должны отображаться в этом конкретном наборе представлений. (Другим вариантом было бы добавить в «главную» таблицу, в которой PK добавит столбец владельца и будет идентифицировать владельца оттуда .... но я считаю это менее гибким ...)
Мои представления выглядели бы примерно так (имена приведены только для иллюстрации):
CREATE VIEW [3rdPartyTable]
AS
SELECT *
FROM [OriginalTable] ot
WHERE EXISTS (SELECT 1 FROM [RecordOwner]
WHERE [Id] = ot.[Id] AND [Owner] = 'Owner1')
CREATE VIEW [3rdPartyTable2]
AS
SELECT *
FROM [OriginalTable2] ot
WHERE EXISTS (SELECT 1 FROM [RecordOwner]
WHERE [Id] = ot.[MasterId] AND [Owner] = 'Owner1')
Я думал о производительности, поскольку в этих оригинальных таблицах имеется немало записей. Когда каждая третья сторона будет запускать свои запросы и присоединиться к их мнение будет SQL Server быть достаточно умны, чтобы оптимизировать несколько идентичных повторен
where exists (select 1 from [RecordOwner]
where [Id] = ot.[MasterId] and [Owner] = 'Owner1')
или нет?
EDIT: Рассмотрим следующий запрос третьим участником DEV пишет:
SELECT * from [3rdPartyTable2] t2
inner join [3rdPartyTable3] t3 on t2.MasterId = t3.Masterid
это тогда бы перевести
SELECT * FROM
(SELECT * FROM [OriginalTable2] ot
where exists (select 1 from [RecordOwner] where [Id] = ot.[MasterId] and [Owner] = 'Owner1')) t2
inner join
(SELECT * FROM [OriginalTable3] ot
where exists (select 1 from [RecordOwner] where [Id] = ot.[MasterId] and [Owner] = 'Owner1')) t3
on t2.MasterId = t3.Masterid
и обе таблицы имеют PK на MasterId
.
Будет ли SQL Server достаточно умен, чтобы оптимизировать несколько повторяющихся статей EXISTS
во взглядах?
Я предполагаю, что 'Id' /' MasterId' - это идентификатор GUID, а не поле Identity?! В противном случае вы столкнетесь с перекрытием. Во всяком случае, если PK 'RecordOwner' является' Owner' и 'MasterId', то почему бы просто не использовать' JOIN' вместо 'WHERE EXISTS()'? В каждом случае я смущен, почему вы ожидаете, что сервер волшебным образом «объединит» те разные ссылки на таблицу «RecordOwner»? Значения 'ot2' НИЧЕГО не имеют общего с теми, что от' ot3' .... Тем не менее, я бы не стал слишком беспокоиться о производительности, сохраняя при этом, что эти копии таблиц в синхронизации для каждого клиента потребуют гораздо больших усилий и Ресурсы. – deroby