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等计算方式类似)

5倍交叉验证如何理解

机器学习笔记1——经验误差模型评估方法和性能度量

机器学习评估方法及性能度量

模型的性能评估 用sklearn进行模型评估