Mysql 交叉应用不适用于更大的数据库,还是替代方案性能更好?

Mysql 交叉应用不适用于更大的数据库,还是替代方案性能更好?,mysql,sql,database,vb.net,ssms,Mysql,Sql,Database,Vb.net,Ssms,那么2个(更多的是3个)问题,我的问题是否只是编码错误或考虑错误?(说实话,我只是刚刚发现了cross apply和相对较新的应用程序)corss apply是使用的最好的连接类型吗?或者为什么它很慢 所以我有一个数据库表(test\tble),大约有6600万条记录。然后我创建了一个##Temp_tble,其中有一列名为Ordr_nbr(nchar(13))。这基本上是我想要找到的 测试文件有4列(订单编号、目的地、货架编号、购买的dte) 这是我当前的查询,它的工作方式与我希望的完全相同,但

那么2个(更多的是3个)问题,我的问题是否只是编码错误或考虑错误?(说实话,我只是刚刚发现了cross apply和相对较新的应用程序)corss apply是使用的最好的连接类型吗?或者为什么它很慢

所以我有一个数据库表(
test\tble
),大约有6600万条记录。然后我创建了一个##
Temp_tble
,其中有一列名为
Ordr_nbr
(nchar(13))。这基本上是我想要找到的

测试文件有4列(订单编号、目的地、货架编号、购买的dte)

这是我当前的查询,它的工作方式与我希望的完全相同,但它的性能似乎非常慢

select ##Temp_tble.Ordr_nbr, test_table1.destination, test_table1.shelf_no,test_table1.dte_bought

         from ##MyTempTable

         cross apply(

         select top 1 test_table.destination,Test_Table.shelf_no,Test_Table.dte_bought 

         from Test_Table

         where ##MyTempTable.Order_nbr = Test_Table.order_nbr

         order by dte_bought desc)test_table1
如果##
Temp_tble
只有17个订单可以搜索,则大约需要2分钟。如您所见,我正试图获取每个订单最近购买的
dte\u
或一些
max(dte\u购买的)

在索引方面,我运行了数据库引擎调谐器,它说它针对查询进行了优化,我创建了所有相关索引,如
test\tble
上的聚集索引,用于
dte\u bunded
desc,包括
order\u nbr

执行计划使用索引扫描(在非集群上)和键查找(在集群上)

我的最终结果是返回##
MyAttribute中的所有
order_nbr
,以及与该
order_nbr
相关的目的地、货架号、dte_购买列,但只返回最近购买的

对不起,如果我解释得太透彻了,我能提供的任何信息都可以询问。我要求的不仅仅是“给我代码”,更多的是指导、建议和学习。先谢谢你

更新 我现在尝试了一种左连接,它工作得比较快,但仍然不是即时的或非常快的(大约30秒),而且它也不会返回最近购买的dte_,有什么想法吗?左连接代码见下文

select a.Order_Nbr,b.Destination,b.LnePos,b.Dte_bought
from ##MyTempTble a

left join Test_Table b
   on a.Order_Nbr = b.Order_Nbr
   where b.Destination is not null
更新2

尝试使用max
dte\u bunded
进行另一个let连接,效果非常好,但只返回
订单编号
,其他列为空。有什么建议吗

select a.Order_nbr,b.Destination,b.Shelf_no,b.Dte_Bought

from ##MyTempTable a

left join 
(select * from Test_Table where Dte_bought = (
select max(dte_bought) from Test_Table)
)b on b.Order_nbr = a.Order_nbr


order by Dte_bought asc

K.M

而不是
交叉应用()
您可以将
内部联接
子查询一起使用。检查以下查询:

SELECT
    TempT.Ordr_nbr
   ,TestT.destination
   ,TestT.shelf_no
   ,TestT.dte_bought
FROM ##MyTempTable TempT
INNER JOIN (
            SELECT   T.destination
                    ,T.shelf_no
                    ,T.dte_bought
                    ,ROW_NUMBER() OVER(PARTITION BY T.Order_nbr ORDER BY T.dte_bought DESC) ID
             FROM Test_Table T           
            ) TestT
            ON TestT.Id=1 AND TempT.Order_nbr = TestT.order_nbr

嗨,非常感谢你的回复。我尝试了您的内部连接查询,最初它出现了“Where”子句的错误,所以我将其修改为“on test.Order\u nbr=TestT.Order\u nbr”,然后是“Where TestT.Id=1”。不幸的是,如果不是更长的话,执行的时间也一样长。还有其他建议吗?我甚至还尝试了左连接。MySQL不支持交叉应用,所以你的问题没有意义。请标记您真正使用的数据库。