SQL Server:优化查询。很多数据

时间:2015-07-10 08:00:16

标签: sql-server query-optimization

一开始,我为因英语不完美而道歉。

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

表A - 问题

 ___________
| ID | Name |

表B - 统计

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

用户可以多次回答一个问题,例如,如果我们有ID = 1的问题和用户(ID为2)回答了这个问题4次,我们将向TableB添加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|

最后,我必须查询用户未响应或回答的问题(TableA),但用户能够回答所有问题的最少次数。

我的查询(程序)如下:

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()

在问题的最初发生的问题 - 如果用户回答了一些问题4次@max将是4。

在第二个查询中,我查询尚未回答的问题(在此情况下)。

问题是:如何优化此查询(或者我应该更改我的表)? TableB现在有近一百万行,因为它不够快。

1 个答案:

答案 0 :(得分:0)

使用SQL-Server(> = 2008),您可以使用OVER子句(https://msdn.microsoft.com/en-us/library/ms189461.aspx)来为您提供分组聚合。

编辑:刚刚找到你的ORDER BY NewID()你为什么这样做? NewID()非常糟糕要排序......实际上100万并不是那么多,但是没有索引的100万GUID就是一个群众...