Select SQL服务器随机8行数据,需要优化
Select random 8 rows of data in SQL Server, need optimization
我需要 select 来自不同表的 8 个具有条件的随机行。我认为我写得很好,但我的代码运行起来很慢。也许不知何故我可以更轻松地编写它或对其进行某种优化?
它正在工作,但需要 8 分钟,我知道然后停止它...也许代码也不是很好我知道。
我的代码
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()
的方法基本上会为结果查询中的每条记录分配一个随机数,在所有 table 都连接在一起等之后,然后对查询进行排序按该数字仅返回前 x
行。对于 returns 100.000 条记录的查询,这种方法肯定很慢。
假设您的主要 table Asmuo
包含大部分记录,而其他 table 只是查找 table,您可以尝试使用TABLESAMPLE
主句 table,像这样:
SELECT TOP 8
...
FROM
Asmuo TABLESAMPLE (100 ROWS) AS a
INNER JOIN
...
不需要 ORDER BY NEWID()
。我们在 TABLESAMPLE 中选择 100 行的原因是因为实际抽样的记录数可能会有所不同。更多信息 here.
如果这仍然不能使查询执行得足够快,请确保连接的 table 已正确编入索引。
我需要 select 来自不同表的 8 个具有条件的随机行。我认为我写得很好,但我的代码运行起来很慢。也许不知何故我可以更轻松地编写它或对其进行某种优化?
它正在工作,但需要 8 分钟,我知道然后停止它...也许代码也不是很好我知道。
我的代码
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()
的方法基本上会为结果查询中的每条记录分配一个随机数,在所有 table 都连接在一起等之后,然后对查询进行排序按该数字仅返回前 x
行。对于 returns 100.000 条记录的查询,这种方法肯定很慢。
假设您的主要 table Asmuo
包含大部分记录,而其他 table 只是查找 table,您可以尝试使用TABLESAMPLE
主句 table,像这样:
SELECT TOP 8
...
FROM
Asmuo TABLESAMPLE (100 ROWS) AS a
INNER JOIN
...
不需要 ORDER BY NEWID()
。我们在 TABLESAMPLE 中选择 100 行的原因是因为实际抽样的记录数可能会有所不同。更多信息 here.
如果这仍然不能使查询执行得足够快,请确保连接的 table 已正确编入索引。