Sql server 每次使用交换或多个联接准备数据?

Sql server 每次使用交换或多个联接准备数据?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,请让我用一个例子来解释: 您需要向客户显示有关某些产品价格的实际信息。最终价格受客户权限、位置、产品装运方式和当前产品供应商的影响 产品数量在100亿以上。此外,你应该用不同的货币显示价格。最后一个问题是,供应商每天都会给他们的产品发送大量的价格,因为那里有很多位置,所以你可以全天应用更新,而客户不想等到你更新所有的价格,想知道当前的价格,我知道这是不可能的,但我的意思是,客户不应该看到这样的消息:对不起,你必须等到所有的价格都更新了 我想要什么 我想将一个表划分为price productId

请让我用一个例子来解释:

您需要向客户显示有关某些产品价格的实际信息。最终价格受客户权限、位置、产品装运方式和当前产品供应商的影响

产品数量在100亿以上。此外,你应该用不同的货币显示价格。最后一个问题是,供应商每天都会给他们的产品发送大量的价格,因为那里有很多位置,所以你可以全天应用更新,而客户不想等到你更新所有的价格,想知道当前的价格,我知道这是不可能的,但我的意思是,客户不应该看到这样的消息:对不起,你必须等到所有的价格都更新了

我想要什么

我想将一个表划分为price productId、vendorId、usdPrice,每次客户进行这样的查询时都会使用这个表

select .... from ThePrice p
  inner join Vendors v ...
  inner join VendorsPrices vp ...
  inner join UserRatio ur ...
  left join ShippingRatio ...
  inner join Currencies ...
  inner join PriceDependsOnLocation ...
分成两个相似的表格

FirstPrice productId、vendorId、usdPrice、user1Ratio、user2Ratio、user3Ratio、ShippingGratio、euroPrice、localPrice

SecondPriceproductId、vendorId、usdPrice、user1Ratio、user2Ratio、user3Ratio、ShippingGratio、euroPrice、localPrice

在哪里

userXRatio-客户权限级别的所有可能因素。额外乘以美元价格。 发货比率-定义客户是否需要发货。额外乘以美元价格。 euroPrice,localPrice-是以不同货币表示的与今天报价相关的价格

看起来像

if (@OneHourPassed = 1) 
  select ... from FirstPrice
else
  select ... from SecondPrice

--not the best way but just to point out
现在,每次都会重新计算所有这些参数,因为价格可以在每次下一次查询时更改,此时价格将更新到价格表中。没有缓存

这意味着,我会不时收到锁,因为当客户搜索产品时,它们也会全天更新。想象一下,在一分钟内,可能会有2000个来自客户的查询,并且会更新来自供应商的一两个价格。在同一张桌子上

我想使用一个准备好的数据:第一个价格表用于读取,第二个价格表用于写入,以更新价格。在某个时刻,也就是一个小时内,他们交换


我只是想知道,应用这种方法的机制是什么。使用IF-s?或者还有其他更优雅的方式吗?

你的问题在太空中听起来有点太离谱了,但从我所能捕捉到的情况来看,也许这样的方式可以帮助你

 create table FirstPrice (
    productId int, 
    vendorId int, 
    usdPrice money, 
    user1Ratio int, 
    user2Ratio int, 
    user3Ratio int, 
    shipppingRatio int, 
    euroPrice money, 
    localPrice money
)

 create table SecondPrice (
    productId int, 
    vendorId int, 
    usdPrice money, 
    user1Ratio int, 
    user2Ratio int, 
    user3Ratio int, 
    shipppingRatio int, 
    euroPrice money, 
    localPrice money
)


 CREATE TABLE LastExecution(execDate datetime default getdate());
 insert into LastExecution(execDate) values (default);
 GO

CREATE PROCEDURE SP_PRICE
AS
BEGIN
  DECLARE @DATE DATETIME
  SELECT @DATE=EXECDATE FROM LastExecution

  IF (DATEDIFF(HOUR,@DATE,GETDATE())>0) 
    BEGIN
      insert into LastExecution(execDate) values (default);
      SELECT 'Second' as [table],* FROM SecondPrice;
    END
  ELSE
    BEGIN
        SELECT 'First' as [table],* FROM FirstPrice;
    END
END;

我想描述有两种方式:

1使用分区,但购买企业版,我仍然不理解切换表的时机

2使用一个视图,该视图可以更改,但您必须创建一个控制表,在该控制表中,您应该保留一个切换表的标志,并且在查询中的每个位置都有该脚本:

while exists(select 1 from ControlTable where SwitchNow = 1)
begin
  waitfor delay '00:00:00.005'
end
-- this is for client-queries, who should release the View from being Altered
或者是另一种方式

create table Switch(Part bit not null);
insert Switch values(0)
go
create view PriceView 
with view_metadata
as
select * from Price1 where 1 = (select Part from Switch)
union all
select * from Price2 where 0 = (select Part from Switch)

但我认为,对于sql规划师来说,这不是一个好主意,还是我看错了?因为如果我错了,那么这是最好的方法。

你的问题非常广泛,没有提供很多关于你在这里尝试做什么的细节。我试图尽量简短,因为人们没有时间阅读大量文本。您建议添加哪些细节更清晰、更容易?是的,我想就是这样,但我也需要它来进行其他计算。我的意思是,我需要一个视图,在这个视图中,我可以绝对肯定,在X时间之前,在计划中也只能使用两个表中的一个。如果-s对程序没有问题,还应检查计划。很抱歉,我以前的版本包含了问题的这一部分。有没有关于这些新信息的建议?无论如何,谢谢!对不起,这次我真的不明白你的问题。你能再解释一遍吗?我的意思是,这个解决方案很清楚,但我有一个更复杂的情况-有很多程序,使用这种查询。我需要一些像视图或大纲之类的东西。说实话——最后一个概要——我真的不知道从哪里开始。