我不是DBA,也不熟悉MS SQL ......
我想知道sql语句是否表现不佳,更具体地说,我想知道交叉连接选择是否表现不佳。不是与另一个选择语句相比,如果它是原始语言的重新组合可能更有效,但与自身相比(我明白这有点模糊......)。
例如,我有下表:
我的桌子有> 100K条目。
我运行以下选择:
select * from dbo.pcopy as p1, dbo.pcopy as p2;
完成需要一天的时间。也许,这很好,但我怎么能确定这个???
我已经看到以下选择,但无法理解如何从中获取糟糕的性能指标:
select * from sys.dm_exec_query_Stats
答案 0 :(得分: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