更节省空间的方法从巨大的表中检索计数

时间:2013-07-22 14:01:28

标签: sql sql-server database performance

我正在使用庞大的客户记录表(大约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

感谢您的见解!

1 个答案:

答案 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;