Sql server SQL Server:优化查询。大量数据

Sql server SQL Server:优化查询。大量数据,sql-server,query-optimization,Sql Server,Query Optimization,一开始我为英语中的单词不够完美而道歉 我的数据库中有两个表,一个包含问题,第二个包含用户对问题的回答(用于统计) 表A-问题 ___________ | ID | Name | 表B-统计数字 ___________________________________ | ID | A_ID | U_ID| IsCorrect | Date| 用户可以多次回答一个问题,例如,如果我们有ID=1的问题,并且用户(ID为2)回答了4次这个问题,我们将在表B中添加4行: ____________

一开始我为英语中的单词不够完美而道歉

我的数据库中有两个表,一个包含问题,第二个包含用户对问题的回答(用于统计)

表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|
最后,我必须查询用户未回答或回答但次数最少的问题(表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()
此时,我查询问题的最大出现次数-如果用户回答了某个问题,则@max将为4次

在第二个查询中,我查询了尚未回答的问题(在这次事件中)

问题是:如何优化这个查询(或者我应该更改我的表)?目前,TableB有近一百万行,因此速度不够快。

对于SQL Server(>=2008),您可以使用OVER子句()来提供分组聚合


编辑:刚刚通过NewID()找到您的
ORDER()
为什么要这样做?NewID()非常糟糕,无法排序。。。事实上,100万不是那么多,但100万没有索引的GUI是一个大数据…

“近100万行”甚至还不接近“大数据”好的观点,我更改了标题我使用了NewID()的顺序来获取随机数据。有没有办法获得随机行?我发现类似于
TABLESAMPLE
的东西更好吗?对于TABLESAMPLE,您必须意识到“样本不必是单个行级别的真正随机样本”。不知道这对您有多重要。。。如果您正好需要40行,可以用40个随机的现有ID填充一个表值变量,并将其用作内部联接(使用索引!)确定,因此
TABLESAMPLE
不是一个选项。我明白,你的解决方案不是那么随机的?问题将按帮助表中的值排序?在
WHERE
语句中使用
(ABS(CAST((BINARY_CHECKSUM(*)RAND())as int))%100)<10
你觉得怎么样?如果你“动态”创建一百万个随机值,你会得到一个“真实”的随机前40名。但是没有索引对一百万个值进行排序不可能很快。。。大表中的标识列(运行编号)和此索引列的内部联接如何,假设现有范围内的40个随机值按随机顺序排列?这应该是随机的,不是吗?如果ID不存在,您可以创建更多,并且仍然使用前40名来避免丢失。。。(由于删除…)好的,你是对的,现在我明白了。但我必须从表A(quesitons)中获取随机值,目前这个表大约有3000行。表B有100多万条。谢谢你的解决方案,我真的很喜欢它,所以我肯定会实施它