Sql server SQL Server:优化查询。大量数据
一开始我为英语中的单词不够完美而道歉 我的数据库中有两个表,一个包含问题,第二个包含用户对问题的回答(用于统计) 表A-问题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行: ____________
___________
| 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多万条。谢谢你的解决方案,我真的很喜欢它,所以我肯定会实施它