首页 > 解决方案 > SQL Server中随机选择8行数据,需要优化

问题描述

我需要从有条件的不同表中选择 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()

我找不到任何解决方案。

标签: sqlsql-serverssms

解决方案


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

假设您的主表Asmuo包含大部分记录,并且其他表只是查找表,您可以尝试TABLESAMPLE在主表上使用该子句,如下所示:

SELECT TOP 8
    ...
FROM
    Asmuo TABLESAMPLE (100 ROWS) AS a
INNER JOIN 
    ...

不需要ORDER BY NEWID()。我们在 TABLESAMPLE 中选择 100 行的原因是因为实际采样的记录数可能会有所不同。更多信息在这里

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


推荐阅读