MS SQL 交叉连接性能评估
Posted
技术标签:
【中文标题】MS SQL 交叉连接性能评估【英文标题】:MS SQL cross join performance evaluation 【发布时间】:2014-01-14 13:54:55 【问题描述】:我不是 DBA,而且是 MS SQL 的新手...
我想知道一个 sql 语句是否表现不佳,更具体地说,我想知道一个交叉连接选择是否表现不佳。不是与另一个选择语句相比,如果它是对原始语句的重新表述,可能会更有效,而是与它本身相比(我知道这有点含糊......)。
例如我有下表:
我的表有 > 100K 条目。
我运行以下选择:
select * from dbo.pcopy as p1, dbo.pcopy as p2;
完成需要一天以上的时间。这也许是好的,但我如何确定这一点???
我看到了以下选择,但不明白如何从中得出性能不佳指标:
select * from sys.dm_exec_query_Stats
【问题讨论】:
好吧,你为超过 100 亿行选择了所有列两次,你怎么能期望“好”的性能? 您到底希望查询做什么?您真的需要所有数据的笛卡尔结果吗? 我并不期待“好”的表现。我对此不抱任何期望。我只是希望能够获得一些关于查询的“有意义的”指标。我选择它是因为它似乎应该对数据库产生不利影响。 如果您的表有超过 10 万个条目,则查询的结果有超过 100,000*100,000 = 10,000,000,000 行。一百亿行是很多行。如果每行有 100 个字节,那么您正在谈论存储 TB 的结果。我想不出在这么大的表上需要交叉连接的合理问题。您应该回顾一下为什么要这样做并提出更好的查询。 您可以查看该查询的等待统计信息。我想它很可能是ASYNC_NETWORK_IO
这是瓶颈。如果你要把它排除在等式之外,你可以看看下一个瓶颈,依此类推。不过,对于这样一个不切实际的例子,我真的不明白这样做的意义。
【参考方案1】:
基本上,通过比较查询读取的页数和返回的行数,您可以说查询的性能很差。例如,如果您阅读了数千页以返回一行,则查询的性能很差。在您的示例中,您没有 WHERE
子句,因此没有太大的改进空间。你正在做一个没有标准的笛卡尔积,所以这里没有什么可以做的。你想要所有数据,多次,所以你得到它。
如果您想改进“真实”查询,第一步是查看他们需要对每个表执行的读取操作。更少的读取,更好的是查询。为此,请打开 IO 统计信息:
SET STATISTICS IO ON
在运行查询之前。您将在 Management Studio 的消息窗格中阅读每个表的统计信息(以页为单位)。 您还可以使用您提到的动态管理视图。将读取与返回的行进行比较(返回的行从 SQL Server 2008 R2 SP1 开始添加到此视图中)
SELECT
t.text,
execution_count,
total_logical_reads,
last_logical_reads,
min_logical_reads,
max_logical_reads,
total_rows,
last_rows,
min_rows,
max_rows
FROM sys.dm_exec_query_Stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) t
【讨论】:
以上是关于MS SQL 交叉连接性能评估的主要内容,如果未能解决你的问题,请参考以下文章
R语言使用yardstick包的rmse函数评估回归模型的性能评估回归模型在每个交叉验证(或者重采样)的每一折fold上的RMSE以及整体的均值RMSE(其他指标maemape等计算方式类似)