我需要提高视图的性能。不幸的是,我不能使用索引,因为我使用了" Top Percent"和查询中的随机性。
以下是视图使用的查询
Select Top (10) Percent from Table
Order By NEWID()
视图在大约50秒内拉出数据太多了。我希望你能帮我找到解决方案,而不涉及业务层。
答案 0 :(得分:1)
根据您的要求,无法改善这一点。获得更多硬件解决方案。您可能会重载tempdb - 在这种情况下,高性能SSD和正确的配置可能有所帮助。
原因是,为了按随机顺序获得前10%,SQL Server必须处理所有行,并按随机元素对它们进行排序。
这种查询类型在纸面上看起来不错,但可能会导致巨大的性能问题。我会先看看这个要求,然后试着解决它。对于非平凡的数据集来说,完全随机性是非常昂贵的。
答案 1 :(得分:1)
对于真正随机的样本,您需要某种形式的随机性。一种不需要排序的方法是近似的,但可能足以满足您的目的:
Select t.*
from Table t
where rand(checksum(newid()) <= 0.1;
这当然是近似值。如果你真的需要完全 10%,这种方法需要更多的工作。
如果几乎随机样本足够好,则可以选择tablesample
(您可以阅读here)。
select t.*
from table t
tablesample (10 percent);
请注意,这是 pages 的随机样本,因此它不是真正的随机样本。并且,它不能在视图中使用。
答案 2 :(得分:0)
假设表中有id。您可以生成随机数以在业务逻辑中选择十个结果。从这里你的SQL将是:
SELECT percent FROM table
WHERE ID IN ([coma separated list here]).