2015-07-10 160 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',你有什么关系? –