2015-07-10 158 views
2

在一開始,我很抱歉,因爲我的英文不完美。SQL Server:優化查詢。很多數據

我有兩個表在我的數據庫,一個包含了問題,第二個包含了用戶的問題答案(統計)。

表A - 問題

___________ 
| ID | Name | 

表B - 統計

___________________________________ 
| ID | A_ID | U_ID| IsCorrect | Date| 

用戶可以回答一個問題幾次,例如,如果我們有ID = 1和用戶(ID爲2)的問題,其回答這個問題4次,我們會在表B中加4行:

___________________________________ 
| ID | A_ID | U_ID| IsCorrect | Date| 
------------------------------------- 
| 1 | 1 | 2 | True | Date| 
| 2 | 1 | 2 | False | Date| 
| 3 | 1 | 2 | False | Date| 
| 4 | 1 | 2 | True | Date| 

最後我得q如果問題(表A)用戶沒有回答或回答,但最少的次數(用戶能夠回答所有問題)。

我的查詢(過程)是這樣的:

Declare @max int 

SET @max = (SELECT TOP 1 Count(A_ID) as QuestionCount FROM [TableB] 
Where User_id = 1 
GROUP BY A_ID 
ORDER BY QuestionCount DESC) 

SELECT TOP 40 ID 
FROM [dbo].[TableA] 
WHERE ID NOT IN (SELECT A_ID 
       FROM [dbo].[TableB] 
       WHERE User_id = 1 
       GROUP BY A_ID 
       HAVING Count(A_ID) = @max) 
ORDER BY NewID() 

在beggining我查詢的問題的最大occurence - 如果用戶回答了一些問題4時@Max將爲4

在第二個查詢我查詢尚未回答的問題(在此發生)。

的問題是:如何優化這個查詢(或者也許我應該改變我的表)?現在TableB有近一百萬行,因爲它不夠快。

+0

「差不多一百萬行」時甚至還沒有接近「大數據「 –

+0

好點,我改了標題 –

回答

0

隨着SQL-服務器(> = 2008),你可以使用OVER子句(https://msdn.microsoft.com/en-us/library/ms189461.aspx),它爲您提供了分組aggregats。

編輯:剛發現你的ORDER BY NewID()你爲什麼要這麼做? NEWID()是非常糟糕排序...... 1萬元是不是其實那麼多,但百萬的GUID沒有索引是一個質量...

+0

我用'ORDER BY NewID()'得到隨機數據。有什麼辦法可以得到隨機的行嗎?我發現像TABLESAMPLE這樣更好嗎? –

+0

使用TABLESAMPLE時,您必須注意「樣本不必是在各行級別上真正隨機的樣本。」不知道這是多麼重要,以你...如果您需要的40行,則可以填寫一個表值變量,40點隨機** **現有的ID,並以此作爲INNER JOIN(使用索引!) – Shnugo

+0

好,所以'TABLESAMPLE'不是一個選項。我明白,你的解決方案不是隨機的?問題將按照助手錶中的值排序?關於在WHERE語句中使用'(ABS(CAST((BINARY_CHECKSUM(*)* RAND())作爲int))%100)<10',你有什麼關係? –