SQL 服务器:优化查询。大量数据
SQL Server : optimize query. Lots of data
在开始时,我为英语的不完美表示歉意。
我的数据库中有两个表,一个包含问题,第二个包含用户对问题的回答(用于统计)。
表 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()
在开始时,我查询问题的最大出现次数 - 如果用户回答某个问题 4 次,@max 将为 4。
在第二个查询中,我查询了尚未回答的问题(在这种情况下)。
问题是:如何优化这个查询(或者我应该更改我的表)? TableB 现在有将近一百万行,因为它不够快。
使用 SQL-Server (>=2008),您可以使用 OVER 子句 (https://msdn.microsoft.com/en-us/library/ms189461.aspx),它会为您提供分组聚合。
编辑:刚刚找到您的 ORDER BY NewID()
为什么要这样做? NewID()排序非常糟糕...实际上 100 万并不算多,但是没有索引的 100 万个 GUID 是一个质量...
在开始时,我为英语的不完美表示歉意。
我的数据库中有两个表,一个包含问题,第二个包含用户对问题的回答(用于统计)。
表 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()
在开始时,我查询问题的最大出现次数 - 如果用户回答某个问题 4 次,@max 将为 4。
在第二个查询中,我查询了尚未回答的问题(在这种情况下)。
问题是:如何优化这个查询(或者我应该更改我的表)? TableB 现在有将近一百万行,因为它不够快。
使用 SQL-Server (>=2008),您可以使用 OVER 子句 (https://msdn.microsoft.com/en-us/library/ms189461.aspx),它会为您提供分组聚合。
编辑:刚刚找到您的 ORDER BY NewID()
为什么要这样做? NewID()排序非常糟糕...实际上 100 万并不算多,但是没有索引的 100 万个 GUID 是一个质量...