Sql server 在T-SQL中是否可以将连接提示与交叉连接一起使用?

Sql server 在T-SQL中是否可以将连接提示与交叉连接一起使用?,sql-server,tsql,Sql Server,Tsql,在T-SQL中是否可以将连接提示与交叉连接一起使用?如果是,语法是什么 select * from tableA cross ? join tableB 根据你的评论 我正试图修改我的执行计划,我估计的行数非常不一致 在嵌套循环中连接。我已将光标更改为交叉连接。。。 现在使用交叉连接的代码更快了,但我想让它更公平 更快。所以我只想尝试一个连接提示 我有900个AF2000000作为嵌套循环的实际值和估计值 我认为这是交叉连接发生的一步 这是ETL的一个表,因此每天都有大量新数据 我有一些建议

在T-SQL中是否可以将连接提示与交叉连接一起使用?如果是,语法是什么

select * 
from tableA
cross ? join tableB
根据你的评论

我正试图修改我的执行计划,我估计的行数非常不一致 在嵌套循环中连接。我已将光标更改为交叉连接。。。 现在使用交叉连接的代码更快了,但我想让它更公平 更快。所以我只想尝试一个连接提示

我有900个AF2000000作为嵌套循环的实际值和估计值 我认为这是交叉连接发生的一步

这是ETL的一个表,因此每天都有大量新数据

我有一些建议

  • 不要直走交叉路口。如果由于基数估计非常糟糕而执行嵌套循环联接,请尝试使用哈希联接提示
  • 这无疑有助于统计数据的更新(研究“提升关键问题”以获取信息)。但是,您可能需要检查您的统计信息是否设置为自动更新,以及它们是否被触发(例如,在ETL之后,查看统计信息的属性以查看它们上次更新的时间等)
  • 尝试修复错误的基数估计。一种方法是将较大的任务划分为较小的任务(例如,划分为临时表)
  • 如果您使用的是表变量(例如,DECLARE@tentable)而不是临时表(例如,CREATE table#tentable),请停止该操作。变量(包括表变量)没有统计信息。旧版本通常假定表变量中有一行。SQL Server 2019(只要您处于最新的兼容模式)对此进行了一些更改,但仍然存在一些大问题

当您将问题归结为一个基数估计值不好的操作时,您还可以做一些事情,例如添加索引/etc来帮助进行该估计(请记住,您可以将索引和主键放在临时表上,如果表被多次访问,它们也可以加快处理速度).

这两个表都将被完整扫描,因此我怀疑您给出的任何提示都会影响性能。你为什么要在这里给出提示?我闻到一种气味。@Larnu我正在尝试修复我的执行计划,我估计的行在嵌套循环联接中非常不一致。我已将光标更改为交叉连接。。。现在使用交叉连接的代码更快了,但我想让它更快。所以我只想尝试一个连接提示。。。谓词都是函数,所以我认为它会影响统计数据……如果估计错误,我建议统计数据已经过时。肯定是XY问题。有关索引维护的详细信息,最好先问一下。简短的回答是“否”。如果您发现
交叉联接
在内部被重写以使用不同类型的联接(添加条件时很容易发生),并且您希望提示(尽管联接提示是最后的手段),请自己重写查询以匹配执行计划。如果这不是一个选项,你就必须摸索着做一些像强制执行计划这样的事情,这一点都不好玩。考虑这种类型的工作的查询存储(QS通常是一个非常有用的工具)。谢谢,但是我有交叉连接,因为我删除了一个游标,游标变量在连接条件中被使用。因此,我只能将交叉联接的表与交叉联接的表合并,而交叉联接的表在其他表被联接时,我会进行筛选。。。有4个联接(表),我根据另一个表过滤它们。。我会试着做一张临时表。谢谢你的提醒!注意临时表的作用是帮助进行基数估计。如果您发现(例如)查询的第一部分出现了错误,您可以将其保存到临时表中,然后使用临时表运行查询的第二部分-这有望获得更好的估计。但是,使用此策略时,您确实需要将重点放在尽可能小的数据大小上(例如,不要交叉连接200万行和100万行,并将其存储在临时表中)。这5个表过于交织,过于分散。有一些标量UDF使用select…中不同表中的列。。。。我可能会拿出一张桌子,但我认为这不值得努力…我会看看我能做什么。。。谢谢你的帮助。。。我认为下一个查询临时表将是有用的…请注意,标量函数也有问题-例如,请参阅Brent Ozar的。你可能想考虑重新写那部分。