Sql server 每次使用交换或多个联接准备数据?
请让我用一个例子来解释: 您需要向客户显示有关某些产品价格的实际信息。最终价格受客户权限、位置、产品装运方式和当前产品供应商的影响 产品数量在100亿以上。此外,你应该用不同的货币显示价格。最后一个问题是,供应商每天都会给他们的产品发送大量的价格,因为那里有很多位置,所以你可以全天应用更新,而客户不想等到你更新所有的价格,想知道当前的价格,我知道这是不可能的,但我的意思是,客户不应该看到这样的消息:对不起,你必须等到所有的价格都更新了 我想要什么 我想将一个表划分为price productId、vendorId、usdPrice,每次客户进行这样的查询时都会使用这个表Sql server 每次使用交换或多个联接准备数据?,sql-server,sql-server-2008,Sql Server,Sql Server 2008,请让我用一个例子来解释: 您需要向客户显示有关某些产品价格的实际信息。最终价格受客户权限、位置、产品装运方式和当前产品供应商的影响 产品数量在100亿以上。此外,你应该用不同的货币显示价格。最后一个问题是,供应商每天都会给他们的产品发送大量的价格,因为那里有很多位置,所以你可以全天应用更新,而客户不想等到你更新所有的价格,想知道当前的价格,我知道这是不可能的,但我的意思是,客户不应该看到这样的消息:对不起,你必须等到所有的价格都更新了 我想要什么 我想将一个表划分为price productId
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对程序没有问题,还应检查计划。很抱歉,我以前的版本包含了问题的这一部分。有没有关于这些新信息的建议?无论如何,谢谢!对不起,这次我真的不明白你的问题。你能再解释一遍吗?我的意思是,这个解决方案很清楚,但我有一个更复杂的情况-有很多程序,使用这种查询。我需要一些像视图或大纲之类的东西。说实话——最后一个概要——我真的不知道从哪里开始。