sql - 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()
我找不到任何解决方案。
解决方案
在所有表连接在一起等之后,您使用的方法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 行的原因是因为实际采样的记录数可能会有所不同。更多信息在这里。
如果这仍然不能使查询执行得足够快,请确保连接的表被正确索引。
推荐阅读
- java - Maven 如何知道要拉取什么与构建什么?
- sql - Oracle VIEW - 将 VARCHAR2 转换为 DATE 并找到 DATE 的 MIN/MAX
- postgresql - Postgresql 无效字节编码 "UTF8" 0xa9
- java - 如果在井字游戏中已经占据了位置,则重复玩家轮流
- git - 如何从某个标签中提取某些文件类型
- html - 为什么 nuxt 将所有 css 链接插入到具有 extractCss true 的每个页面中
- php - 重力形成多步锚偏移
- android - 设置为在计时器期间运行的代码被间歇性触发
- c# - 激活器.CreateInstance | 使用字符串创建 Page.xaml 实例
- r - 如何编辑 R S4 Object 的摘要代码?