我有一個數據庫表,UserRewards擁有三千萬以上的行。在這一行中,每行都有一個用戶ID和一個獎勵ID(以及其他字段)。將多行轉換爲單列
有一個用戶表(具有約400萬獨立用戶),具有主鍵的用戶ID等領域。 由於性能方面的原因,我希望將userrewards中每個用戶的獎勵ID移動到用戶的連接字段中。 (新的nvarchar(4000)字段稱爲獎勵) 我需要一個腳本,可以儘快做到這一點。
我用下面的腳本加入了獎勵光標,但它只有大約每分鐘100個用戶,這將需要時間太長得到儘管約400萬獨立用戶我處理。
set @rewards = (select REPLACE((SELECT rewardsId AS [data()] from userrewards
where UsersID = @users_Id and BatchId = @batchId
FOR XML PATH('') ), ' ', ','))
任何建議,以優化?我即將嘗試一段時間循環,看看它是如何工作的,但任何其他想法都會被大大接受。
編輯:
我的網站具有以下功能:
我們有大約400萬用戶誰已預先分配5-10「大獎」。這種關係在用戶對話表中。
的用戶來到現場,我們確定他們,查找在數據庫中分配給他們的獎勵。
的問題是,該網站是非常受歡迎的,所以我有大量的人訪問該網站,同時請求他們的數據。以上將減少我的加入,但我知道這可能不是最好的解決方案。我的數據庫服務器在我調整網站的10秒內達到100%的CPU使用率,所以大多數人的請求超時(它們顯示爲錯誤頁面),或者他們得到結果,但不是在令人滿意的時間。
有人能夠提出一個更好的解決我的問題?
...真的嗎?我已經可以告訴你,在SQL中使用分隔列(多值列)是**真的**嚴重不滿。 「對於性能」並不是一個令人信服的理由(查詢該列往往比其值得的更麻煩) - 通常它們最終分列在分析數據庫的不同列中。 4mil排馬馬虎虎,但花生在任何專用系統上。另外,遊標/循環在SQL中通常是錯誤的(通常這可能是性能問題的最大部分)。你想要解決什麼_actual_問題。還有哪些其他查詢「很慢」? –
查詢速度很快,但我有5k-10k用戶同時點擊我的服務器,請求來自userrewards表的數據。 (擁有3000萬行的那個)。這將加入到用戶表和文件管理器上,並由用戶提供唯一標識符。我在一列中更新的代碼實現了更好的緩存,並且不會進行任何連接,速度也會提高很多。我只需要儘可能快地將我當前的大數據集轉換爲正確的格式。現在,SQL服務器是一個專用的盒子。我需要看到關於ugradding它..我應該RAM,CPU或兩者?目前8GB的內存,2.00 zeon CPU – mp3duck
就單列的東西而言,雖然它可能會皺眉,但我有效的代碼比以前更快。 – mp3duck