我正在使用庞大的客户记录表(大约6200万客户),我需要为每个客户检索计数。目前,有一个Order表和一个Unique Customers表。我执行一个简单的内连接来检索记录。
但是,由于Orders表的大小,临时文件超过15 GB。这是有问题的,因为客户的可用空间有限。是否有比我当前查询更节省空间的方法来检索计数?
SELECT A.CustomerID
,B.OrderID
,count(distinct B.OrderID) as Num_Orders
FROM UniqueCustomers as A
INNER JOIN Orders as B on A.CustomerID = B.CustomerID
GROUP BY A.CustomerID, B.OrderID
感谢您的见解!
答案 0 :(得分:6)
不知道你为什么在输出列表中包含OrderID
- 你正试图获得计数,对,而不是6200万OrderID
的列表?此外,我不确定您为什么需要将DISTINCT
应用于OrderID
- 您的Orders
表格不应允许此处包含重复值;如果是这样,你的架构搞砸了。
使用EXISTS
子句而不是JOIN
可能更有效 - 但是如果您使用SELECT INTO
,则可以翻转。
SELECT CustomerID, Num_Orders = COUNT(OrderID)
FROM dbo.Orders AS o
WHERE EXISTS
(
SELECT 1 FROM dbo.UniqueCustomers WHERE CustomerID = o.CustomerID
)
GROUP BY CustomerID;