无需使用索引即可提高视图性能

时间:2016-03-24 15:25:56

标签: sql sql-server

我需要提高视图的性能。不幸的是,我不能使用索引,因为我使用了" Top Percent"和查询中的随机性。

以下是视图使用的查询

Select Top (10) Percent from Table
Order By NEWID()

视图在大约50秒内拉出数据太多了。我希望你能帮我找到解决方案,而不涉及业务层。

3 个答案:

答案 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]).