如何在具有数百万条记录的表上使用MAX

时间:2018-06-22 16:04:56

标签: sql sql-server tsql query-performance

我有一个表,其中包含与交易有关的所有信息,它具有进行销售的deviceID以及交易号(此表有数百万行)。我在临时表上有一些DeviceID的列表,并且正在联接事务表以获取最大事务数,但是要花很多时间才能显示结果。有没有更好的方法来编写sql语法以在更短的时间内获得结果?也许在同一个事务表中进行子查询以获取MAX值,任何想法将不胜感激。我当前的代码如下:

select a.DeviceID,
MAX(tq.Transaction_number)
from Datawarehouse.DBO.Transactions tq with (nolock)
/*The #Temp1 table contains the Device IDs we want to get the MAX transaction number ,
the total amount of Devices are between 1 and 1000 */
inner join #Temp1 a on a.DeviceID = tq.DeviceID
--We only want the MAX transaction number for sales ( Not Refunds)
where tq.Transaction_type = 'SALES'

3 个答案:

答案 0 :(得分:1)

有时候效果更好:

select t.*,
       (select max(tq.Transaction_number)
        from Datawarehouse.DBO.Transactions tq
        where t.DeviceID = tq.DeviceID and tq.Transaction_type = 'SALES'
       )
from #temp1 t;

尤其是,您希望在Transactions(DeviceID, Transaction_type, Transaction_number desc)上使用复合索引。

答案 1 :(得分:1)

我认为适当的索引编制会有所帮助。看看Example-Fiddle

查询:

Select
    d.device_id,
    MAX( t.transaction_id ) transaction_id
From
    devices d
JOIN
    transactions t
    ON t.device_id = d.device_id
    # AND transaction_types = ...
GROUP BY
    d.device_id;

答案 2 :(得分:0)

您可以使用apply

select t.DeviceID, tt.Transaction_no
from #temp1 t cross apply ( 
     select max(tr.Transaction_number) Transaction_no
     from Datawarehouse.DBO.Transactions tr
     where t.DeviceID = tr.DeviceID and 
           tr.Transaction_type = 'SALES'
) tt;

但是,如果您在({{1} DeviceID  &Transaction_type),并且不要在查询之前忘记Transaction_number,尤其是在使用SSMS时。