2014-10-10 54 views
1

請讓我來舉個例子來解釋一下:每次準備交換或多次連接的數據?

您需要向客戶展示某些產品價格的實際信息。最終價格受到客戶的好評,他的位置,運送產品的方式以及當前產品的供應商的影響。

產品數量超過100億。除此之外,你應該以不同的貨幣顯示價格。最後一個問題是,供應商每天都會在他們的產品上每天發送很多價格,由於在那裏有很多職位,您可以在整天內申請(更新),而客戶不希望等到更新完全他們想知道現在的價格(我知道這是不可能的,但我的意思是 - 客戶不應該看到這樣的消息:「對不起,你必須等到所有的價格更新」)。

我想要什麼

我想將一個表ThePrice (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, shipppingRatio, euroPrice, localPrice)

and

SecondPrice(productId, vendorId, usdPrice, user1Ratio, user2Ratio, user3Ratio, shipppingRatio, euroPrice, localPrice)

userXRatio - 爲客戶privelege級別的所有可能的因素。在usdPrice上增加乘數。 shippingRatio - 定義客戶是否需要運送。在usdPrice上增加乘數。 euroPrice,localPrice - 是以不同貨幣顯示的價格與今日報價相關的價格。

這可能看起來像

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

--not the best way but just to point out 

現在,這一切參數都在每次重新計算,因爲價格可以在每一個查詢更改,當將被更新以ThePrice表。這沒有緩存。

這意味着我不時收到鎖,因爲當客戶搜索產品時,他們也會在一整天內更新。想象一下 - 一分鐘內可能有2000個來自客戶的查詢,供應商的一兩個價格將被更新。 在同一張表中!

我想使用一個準備好的數據:雖然FirstPrice表用於讀取,但SecondPrice表用於寫入 - 更新價格。在某個時刻,他們互換,即在一個小時內。

而我只想知道 - 應用這個機制的機制是什麼。使用IF-s?還是有另一種更優雅的方式?

+0

你的問題是非常廣泛的,並沒有提供很多關於你在這裏做什麼的細節。 – 2014-10-10 14:18:04

+0

我試圖儘可能縮短,因爲人們沒有時間閱讀大量文本。你建議添加什麼細節更清晰和簡單? – notricky 2014-10-10 15:52:25

回答

0

你的問題在太空中聽起來太厲害了,但是從我能捕獲的東西中,也許這樣的東西可以幫助你。

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; 
+0

是的,這就是我想的,但我也需要它來做其餘的計算。我的意思是我需要像視圖這樣的東西,在那裏我可以絕對確定,直到X時間只有兩張桌子中的一張將被使用(在一個計劃中)。 IF-s對於程序是可以的(還應該檢查計劃)。 (我很抱歉 - 我以前的版本是關於這個問題的一部分)。有關此新信息的任何建議?不管怎樣,謝謝! – notricky 2014-10-10 18:12:32

+0

Sorrry,這次我真的不理解你的問題。你能再解釋一遍嗎? – 2014-10-10 19:26:17

+0

我在說,這個解決方案很明確,但是我有一些更復雜的情況 - 有很多程序,使用這種查詢的地方。我需要像view或synonims之類的東西。說真話 - 最後一個(synonim) - 我不知道從哪裏開始。 – notricky 2014-10-11 21:04:59

0

我想這一個descision是兩種方式:

1)使用Partitions,但與購買企業版,我還是不明白,此刻的交換表

2)使用View,這是可能的Alter,但你必須做一個控制表,在那裏你應該持有一個切換表的標誌,並在查詢中有這個腳本無處不在:

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的策劃者是一個好主意還是我把它錯了嗎?因爲如果我錯了,那麼這是最好的方法。