SQL中的视图或函数是否更快?

时间:2017-11-09 17:57:22

标签: sql-server temporal-database

我有一张有客户收据的表格。我正在尝试根据部门的用户名称,地址和购买总额生成报告。所需的输出应该看起来像

|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亿行,因此计算报告需要花费20多分钟。

我在视图上尝试过CTE而没有成功。我尝试过不同的JOIN订单。我使用过LEFT Joins。即使是Pivot也没有放慢速度。我还是不能在20分钟内得到它。

在我开始创建一个功能以使其低于5秒目标的路径之前,我愿意接受任何建议。我此时改变指数的能力有限。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

嗯,很明显,视图和SQL函数是不同的东西。

尝试使用以下需要向用户清楚的功能(可能是你自己!),返回的数据需要某些参数,如果没有这些参数,数据没有意义。有点像强制用户包含WHERE子句。

在您的示例中,您可能希望强制用户按CustomerId或ReceiptId进行过滤。

...无论其

在这种情况下,视图方法可能会更好。

  1. 按功能设计,函数不使用临时表,而是使用表变量。作为变量的表比临时表慢得多。
  2. 您所包含的查询非常简单,毫无意外。这里的观点是最简单和最好的方法。
  3. 对于125M行,我建议在处理期间检查执行计划(包括WHERE子句)或将数据转储到定期更新的汇总表中。或两者。在整个过程中检查索引。

    以下是更多(更好)的讨论Test SQL Queries