Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL中的视图或函数是否更快?_Sql Server_Temporal Database - Fatal编程技术网

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

Sql server SQL中的视图或函数是否更快?,sql-server,temporal-database,Sql Server,Temporal Database,我有一张有顾客收据的桌子。我正试图根据用户的姓名、地址和按部门划分的采购总额生成一份报告。所需的输出应该如下所示 收据表是时态模型的一部分。因此,代码如下所示: 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

我有一张有顾客收据的桌子。我正试图根据用户的姓名、地址和按部门划分的采购总额生成一份报告。所需的输出应该如下所示



收据表是时态模型的一部分。因此,代码如下所示:

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、部门、金额、CreatedDate、UpdateDate

其思想是,如果收据被更新,更新后的金额可以根据退货、价格调整等进行调整

目标是在5秒内得到查询。由于仅在receiptitems表中就有超过1.25亿行,因此计算报告需要SQL 20+分钟

我试过CTE的观点,但没有成功。我试过不同的加入命令。我使用了左连接。即使是Pivot也没有减慢速度。我在20分钟内还没拿到

在我开始创建一个函数以使其低于5秒的目标之前,我愿意接受任何建议。我现在修改索引的能力有限


有什么想法吗?

显然,视图和SQL函数是不同的

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

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

然而

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

  • 函数在设计上不使用临时表,而是使用表变量。作为变量的表比临时表慢得多
  • 您包含的查询非常直截了当,毫无意外。在这里,视图将是最简单和最好的方法
  • 对于125M行,我建议要么在处理期间检查执行计划(为此包括WHERE子句),要么将数据转储到定期更新的汇总表中。或者两者兼而有之。一直检查索引


    这里有更多(更好)的讨论

    很明显,视图和SQL函数是不同的

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

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

    然而

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

  • 函数在设计上不使用临时表,而是使用表变量。作为变量的表比临时表慢得多
  • 您包含的查询非常直截了当,毫无意外。在这里,视图将是最简单和最好的方法
  • 对于125M行,我建议要么在处理期间检查执行计划(为此包括WHERE子句),要么将数据转储到定期更新的汇总表中。或者两者兼而有之。一直检查索引


    这里有更多(更好)的讨论

    无何过滤器?你说你有一张1.25亿行的桌子。查询的输出有多大?即使服务器在5秒钟内处理完所有这些行,我很确定您也无法在分配的时间内通过网络在应用程序中处理这些行。我显示的查询只是为了了解数据库如何链接。我确实使用where过滤器来限制1-2个客户。那么c.的名字,比如“沃尔特·怀特”。我们还有一个客户号码,我可以用它来吸引客户。等等,你为一个客户运行这个程序,需要20多分钟?一个客户的结果集有多大?你能为一个客户发布查询执行计划吗?我不能发布太多信息,因为实际设置是专有的。我能说的是,我提供的基本模型涵盖了系统。没有何处过滤器?你说你有一张1.25亿行的桌子。查询的输出有多大?即使服务器在5秒钟内处理完所有这些行,我很确定您也无法在分配的时间内通过网络在应用程序中处理这些行。我显示的查询只是为了了解数据库如何链接。我确实使用where过滤器来限制1-2个客户。那么c.的名字,比如“沃尔特·怀特”。我们还有一个客户号码,我可以用它来吸引客户。等等,你为一个客户运行这个程序,需要20多分钟?一个客户的结果集有多大?你能为一个客户发布查询执行计划吗?我不能发布太多信息,因为实际设置是专有的。我能说的是,我提供的基本模型涵盖了这个系统。
    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