【发布时间】:2018-04-22 20:17:07
【问题描述】:
我有一张桌子,上面有客户收据。我正在尝试根据用户的姓名、地址和部门采购总额生成报告。所需的输出应如下所示
|Customer |Address | Clothing | Electronics | Hardware | Household |
|Homer Simpson | 724 Evergreen Terr | $42 | $20 | $500 | $24 |
|Walter White | 308 Negra Arroyo Lane | $120 | $80 | $52 | $2400 |
收据表是时间模型的一部分。因此,代码如下所示:
Select c.customername,a.address,r.receiptno,ir.department,ir.total
from customer c
inner join customer_address_lnk cal on cal.customerid = c.id
inner join address a on cal.addressid = a.id
inner join customer_receipts_lnk crl on crl.customerid = c.id
inner join receipts r on crl.receiptid = r.id
inner join receipts_receiptitem_lnk rrl on rrl.receiptid = r.id
inner join receiptitem ri on ri.id = rrl.receiptitemid
lnk 表是链接表。
receiptitem 表有以下列:ID、Department、Amount、CreatedDate、UpdatedDate
这个想法是,如果收据被更新,更新后的金额可以根据退货、价格调整等进行调整。
目标是在 5 秒内完成查询。由于我们仅在receiptitems 表中就有超过1.25 亿行,因此需要SQL 20 多分钟来计算报告。
我在视图上尝试了 CTE,但没有成功。我尝试过不同的 JOIN 订单。我用过左连接。甚至 Pivot 也没有减慢它的速度。 20分钟之内我还是看不懂。
在我开始创建一个函数以使其达到 5 秒目标之前,我愿意接受任何建议。我目前更改索引的能力有限。
有什么想法吗?
【问题讨论】:
-
没有 WHERE 过滤器?你说你有一个 1.25 亿行的表。查询的输出有多大?即使服务器在 5 秒内处理所有这些行,我很确定您无法通过网络将其通过管道传输并在分配的时间内在您的应用程序中处理它。
-
我展示的查询只是为了说明数据库如何链接。我确实使用 where 过滤器来限制 1-2 个客户。所以在哪里 c.name 像'Walter White'。我们还有一个客户编号,我可以用它来吸引客户。
-
等一下,您为 一个 客户运行此程序需要 20 多分钟?一个客户的结果集有多大?您可以发布一位客户的查询执行计划吗?
-
我不能发布太多信息,因为实际设置是专有的。我可以说的是,我提供的基本模型涵盖了系统。
标签: sql-server temporal-database