Проверьте ограничения, не работающие на запрос / представление с объединением - PullRequest
0 голосов
/ 28 мая 2019

У нас есть представление, описанное как:

CREATE view [dbo].[PriceHourlyView]
AS
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly WITH (NOLOCK)
union all
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly2018 WITH (NOLOCK)
union all
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly2017 WITH (NOLOCK)
union all
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly2016 WITH (NOLOCK)
union all
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly2015 WITH (NOLOCK)
union all
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly2014 WITH (NOLOCK)
union all
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly2013 WITH (NOLOCK)
union all
select NodeId, TimeStamp,RtDa,MarketId,Lmp,Mlc,Mcc,Issettledprice,datecreated,IsCalculated from dbo.PriceHourly2012 WITH (NOLOCK)

Каждая из таблиц имеет следующие проверочные ограничения для каждого года, за исключением текущей таблицы без указания года:

ALTER TABLE [dbo].[PriceHourly2017]  WITH CHECK ADD  CONSTRAINT [CK_PriceHourly2017_Timestamp] CHECK  (([timestamp]>='2017-01-01' AND [timestamp]<='2017-12-31 23:59'))

Когда это представление запрашивается само по себе, проверочные ограничения ограничивают поиск таблиц. План выполнения выглядит следующим образом:

SELECT
  *
FROM PriceHourlyview
WHERE nodeid = 24511
AND TimeStamp BETWEEN '2017-05-17' AND '2017-05-24'

Correct check constraints

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

SELECT
  *
FROM ShapeProfileDetails s WITH (NOLOCK)
LEFT JOIN PriceHourlyView p WITH (NOLOCK)
  ON s.TimeStamp = p.Timestamp
  AND s.EffectiveDate BETWEEN '2017-05-17' AND '2017-05-24'
WHERE NodeId = 24512
--AND s.EffectiveDate BETWEEN '2017-05-17' AND '2017-05-24'

Incorrect check constraints

Я знаю, что не запрашиваю одно и то же поле в объединенном примере и предполагаю, что это проблема, но это поле, которое мне нужно запросить для получения правильных результатов. Мне интересно, есть ли в любом случае подсказка или заставить запрос использовать правильные ограничения проверки. Или как лучше присоединиться, чтобы попытаться использовать эти проверочные ограничения.

1 Ответ

1 голос
/ 28 мая 2019

Хорошо, как уже говорилось, мы знаем, что EffectiveDate и TimeStamp почти одинаковы.Я бы попробовал сделать что-то подобное.Технически это тот же запрос, но мы сообщим SQL Server, что он может использовать ограничения (просто вычтите и добавьте один день по краям BETWEEN).

SELECT * FROM ShapeProfileDetails s WITH (NOLOCK) 
JOIN PriceHourlyView p WITH (NOLOCK) 
   ON s.TimeStamp = p.Timestamp 
AND s.EffectiveDate BETWEEN '2017-05-17' AND '2017-05-24' 
AND s.TimeStamp BETWEEN '2017-05-16' AND '2017-05-25' 
WHERE NodeId = 24512
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...