【问题标题】:Are Views or Functions faster in SQL?SQL 中的视图或函数更快吗?
【发布时间】: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


【解决方案1】:

好吧,显然视图和 SQL 函数是不同的东西。

尝试使用一个函数,以便将来用户(可能是您自己!)清楚地知道返回的数据需要某些参数,如果没有这些参数,数据就没有意义。有点像强迫用户包含 WHERE 子句。

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

但是....

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

  1. 根据设计,函数不使用临时表,而是使用表变量。作为变量的表比临时表慢得多。
  2. 您所包含的查询非常简单,没有任何意外。视图将是这里最简单和最好的方法。

对于 125M 行,我建议在处理期间检查执行计划(为此包括 WHERE 子句)或将数据转储到定期更新的汇总表中。或两者。一路检查索引。

这里有更多(更好的)讨论Test SQL Queries

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-16
    • 2014-10-14
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多