笛卡尔乘积则可以返回所有月份的所有客户。笛卡尔乘积基本上是将第一个表与第二个表相乘,生成一个行集合,其中包含第一个表中的行数与第二个表中的行数相乘的结果。因此,笛卡尔乘积会向表@tblFinal返回972行。最后的步骤是使用此日期范围内每个客户的月销售额总计更新@tblFinal表,以及选择最终的行集。
如果由于笛卡尔乘积占用的资源可能会很多,而不需要真正的笛卡尔乘积,则可以谨慎地使用CROSSJOIN。例如,如果对产品和类别执行了CROSSJOIN,然后使用WHERE子句、DISTINCT或GROUPBY来筛选出大多数行,那么使用INNERJOIN会获得同样的结果,而且效率高得多。如果需要为所有的可能性都返回数据(例如在您希望使用每月销售日期填充一个图表时),则笛卡尔乘积可能会非常有帮助。但是,您不应该将它们用于其他用途,因为在大多数方案中INNERJOIN的效率要高得多。
拾遗补零
这里介绍其他一些可帮助提高SQL查询效率的常用技术。假设您将按区域对所有销售人员进行分组并将他们的销售额进行小计,但是您只想要那些数据库中标记为处于活动状态的销售人员。您可以按区域对销售人员分组,并使用HAVING子句消除那些未处于活动状态的销售人员,也可以在WHERE子句中执行此操作。在WHERE子句中执行此操作会减少需要分组的行数,所以比在HAVING子句中执行此操作效率更高。HAVING子句中基于行的条件的筛选会强制查询对那些在WHERE子句中会被去除的数据进行分组。
另一个提高效率的技巧是使用DISTINCT关键字查找数据行的单独报表,来代替使用GROUPBY子句。在这种情况下,使用DISTINCT关键字的SQL效率更高。请在需要计算聚合函数(SUM、COUNT、MAX等)的情况下再使用GROUPBY。另外,如果您的查询总是自己返回一个唯一的行,则不要使用DISTINCT关键字。在这种情况下,DISTINCT关键字只会增加系统开销。
您已经看到了,有大量技术都可用于优化查询和实现特定的业务规则,技巧就是进行一些尝试,然后比较它们的性能。最重要的是要测试、测试、再测试。在此专栏的将来各期内容中,我将继续深入讲SQLServer概念,包括数据库设计、好的索引实践以及SQLServer安全范例。
文章来源于领测软件测试网 https://www.ltesting.net/