SQL 中的视图或函数是否更快?
Are Views or Functions faster in SQL?
我有一个 table 客户收据。我正在尝试根据用户姓名、地址和按部门划分的购买总额生成报告。所需的输出应类似于
|Customer |Address | Clothing | Electronics | Hardware | Household |
|Homer Simpson | 724 Evergreen Terr | | | 0 | |
|Walter White | 308 Negra Arroyo Lane | 0 | | | 00 |
收据 table 是时间模型的一部分。因此,代码如下所示:
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 table 正在链接 table。
receiptitem table 包含以下列:ID、Department、Amount、CreatedDate、UpdatedDate
想法是,如果收据被更新,更新后的金额可以进行调整 returns、价格调整等等。
目标是在 5 秒内完成查询。由于我们仅在收据项 table 中就有超过 1.25 亿行,因此计算报告需要 SQL 20 多分钟。
我尝试过 CTE 的观点,但没有成功。我尝试过不同的 JOIN 命令。我用过左连接。甚至 Pivot 也没有放慢速度。不到20分钟我还是搞不定。
在我开始创建函数以实现 5 秒目标之前,我愿意接受任何建议。我目前更改索引的能力有限。
有什么想法吗?
嗯,显然视图和 SQL 函数是不同的东西。
尝试使用一个函数,它需要在未来让用户(也许是你自己!)清楚,返回的数据需要某些参数,如果没有这些参数,数据就没有意义。有点像强制用户包含 WHERE 子句。
在您的示例中,您可能希望强制用户按 CustomerId 或 ReceiptId 进行筛选。
然而....
在这种情况下,视图方法可能会更好。
- 函数在设计上不使用临时 table,而是使用 table 变量。作为变量的表比 temp tables.
慢得多
- 您所包含的查询非常直接,没有任何意外。视图将是这里最简单和最好的方法。
对于 125M 行,我建议在处理过程中检查执行计划(为此包括一个 WHERE 子句)或将数据转储到定期更新的摘要 table 中。或两者。一路检查索引。
这里有更多(更好)的讨论Test SQL Queries
我有一个 table 客户收据。我正在尝试根据用户姓名、地址和按部门划分的购买总额生成报告。所需的输出应类似于
|Customer |Address | Clothing | Electronics | Hardware | Household |
|Homer Simpson | 724 Evergreen Terr | | | 0 | |
|Walter White | 308 Negra Arroyo Lane | 0 | | | 00 |
收据 table 是时间模型的一部分。因此,代码如下所示:
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 table 正在链接 table。
receiptitem table 包含以下列:ID、Department、Amount、CreatedDate、UpdatedDate
想法是,如果收据被更新,更新后的金额可以进行调整 returns、价格调整等等。
目标是在 5 秒内完成查询。由于我们仅在收据项 table 中就有超过 1.25 亿行,因此计算报告需要 SQL 20 多分钟。
我尝试过 CTE 的观点,但没有成功。我尝试过不同的 JOIN 命令。我用过左连接。甚至 Pivot 也没有放慢速度。不到20分钟我还是搞不定。
在我开始创建函数以实现 5 秒目标之前,我愿意接受任何建议。我目前更改索引的能力有限。
有什么想法吗?
嗯,显然视图和 SQL 函数是不同的东西。
尝试使用一个函数,它需要在未来让用户(也许是你自己!)清楚,返回的数据需要某些参数,如果没有这些参数,数据就没有意义。有点像强制用户包含 WHERE 子句。
在您的示例中,您可能希望强制用户按 CustomerId 或 ReceiptId 进行筛选。
然而....
在这种情况下,视图方法可能会更好。
- 函数在设计上不使用临时 table,而是使用 table 变量。作为变量的表比 temp tables. 慢得多
- 您所包含的查询非常直接,没有任何意外。视图将是这里最简单和最好的方法。
对于 125M 行,我建议在处理过程中检查执行计划(为此包括一个 WHERE 子句)或将数据转储到定期更新的摘要 table 中。或两者。一路检查索引。
这里有更多(更好)的讨论Test SQL Queries