首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在SQL Server中随机选择8行数据,需要优化

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

Stack Overflow用户
提问于 2019-10-08 02:41:27
回答 1查看 53关注 0票数 0

我需要选择8个随机行从不同的表与条件。我认为我写得很好,但我的代码运行得很慢。也许我可以更轻松地编写它,或者对它进行某种优化?

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

我的代码

代码语言:javascript
运行
复制
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()

我找不到任何解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-08 03:46:17

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

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

代码语言:javascript
运行
复制
SELECT TOP 8
    ...
FROM
    Asmuo TABLESAMPLE (100 ROWS) AS a
INNER JOIN 
    ...

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58275384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档