在SQL Server中选择随机的8行数据,需要优化

问题描述 投票:0回答:1

我需要根据条件从不同的表中选择8个随机行。我想我写的不错,但是我的代码工作得很慢。也许我可以更轻松地编写它或对其进行某种优化?

它正在工作,但是花了8分钟然后idk,然后停止它……也许代码也不是idk太好了。

我的代码

SELECT TOP 8  
    a.vardas, m.miestoPavadinimas, ab.numeris, ab.sutartiesPradzia, 
    ab.sutartiesPabaiga, 
    Op.operatoriausPavadinimas,
    p.planoPavadinimas, Uzip.uzsakymoData as InternetPozymisNusakantis, 
    Uzp.uzsakymoData as PapildPozymisNusankantis
FROM 
    Asmuo AS a
INNER JOIN 
    Abonentas AS ab ON ab.asmensID = a.asmensID
INNER JOIN 
    Miestas AS m ON m.miestoID = a.miestoID
INNER JOIN 
    Planas AS p ON p.planoID = ab.planoID
INNER JOIN 
    Operatorius AS Op ON Op.operatoriausID = p.operatoriausID
INNER JOIN 
    InternetoPlanas AS itp ON itp.operatoriausID = Op.operatoriausID
LEFT JOIN 
    UzsakytasInternetoPlanas AS Uzip ON itp.internetoPlanoID = Uzip.internetoPlanoID 
LEFT JOIN 
    UzsakytaPapildomaPaslauga AS Uzp ON Uzp.abonentoID = Uzp.abonentoID 
WHERE 
    ((Uzip.uzsakymoData IS NOT NULL AND Uzip.atsisakymoData IS NULL) 
     OR
     (Uzp.uzsakymoData IS NOT NULL AND Uzp.atsisakymoData IS NULL))
ORDER BY 
    NEWID()

我找不到任何解决方案。

sql sql-server ssms
1个回答
0
投票

您使用SELECT TOP x ... ORDER BY NEWID()的方法基本上会在将所有表连接在一起之后,为结果查询中的每个记录分配一个随机数,依此类推,然后按该数字对查询进行排序,仅返回第一个x行。对于返回许多记录的100.000的查询,此方法势必很慢。

假设您的主表Asmuo包含大多数记录,而其他表仅仅是查找表,您可以尝试在主表上使用TABLESAMPLE子句,如下所示:

TABLESAMPLE

不需要SELECT TOP 8 ... FROM Asmuo TABLESAMPLE (100 ROWS) AS a INNER JOIN ... 。我们在TABLESAMPLE中选择100行的原因是,实际采样的记录数可能会有所不同。详细信息ORDER BY NEWID()

如果这仍然不能使查询执行得足够快,请确保正确索引了联接的表。

© www.soinside.com 2019 - 2024. All rights reserved.