我需要根据条件从不同的表中选择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()
我找不到任何解决方案。
您使用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()
。
如果这仍然不能使查询执行得足够快,请确保正确索引了联接的表。