1

我正在对查询存储进行以下查询:

SELECT 
TOP 100
    qp.last_execution_time [qp__last_execution_time],
    qt.query_sql_text,
    len(qt.query_sql_text) sql_length,      
    round(rs.avg_duration ,5) avg_duration
    ,max_rowcount,avg_rowcount,last_rowcount
FROM 
    sys.query_store_plan qp
    INNER JOIN sys.query_store_query         [q]        ON qp.query_id = q.query_id
    INNER JOIN sys.query_store_query_text    [qt]       ON q.query_text_id = qt.query_text_id
    INNER JOIN sys.query_store_runtime_stats [rs]       ON qp.plan_id = rs.plan_id
WHERE
order by len(qt.query_sql_text) desc

我注意到的是,[query_sql_text] 似乎被截断了,例如一个典型的语句将以:

CAST( '20170920 00:00:00' AS datetime),CAST( '20140701 00:00:

可能相关:
本例中的 SQL 是由 Power BI 生成的。
截断文本时,len(qt.query_sql_text) 不会以相同的值最大化。
我通过从 SSMS 结果窗格复制/粘贴到记事本来查看 SQL。

SQL 版本:Microsoft SQL Azure (RTM) - 12.0.2000.8 2017 年 8 月 29 日 13:06:11

我记得在 SQL Server 截断 SQL 的其他一些“系统表”中。

所以问题是:谁能明确地说 [sys.query_store_query_text].[query_sql_text] 在某些情况下是否可以被 SQL Server 本身截断?

另一种可能性,即客户端应用程序中发生的截断,没有任何意义,因为它必须向 SQL Server 发送完整、有效的 SQL 语句,否则如何执行?然而, len(query_sql_text) 中的差异排除了超出列长度限制的可能性。

这里可能发生了什么?

4

1 回答 1

7

在将数据返回到数据网格时,SSMS 将截断 blob 结果。您可以在查询选项中修改长度,或以 XML 形式返回数据。例如

SELECT 
TOP 100
    qp.last_execution_time [qp__last_execution_time],
    qt.query_sql_text,
    len(qt.query_sql_text) sql_length,      
    round(rs.avg_duration ,5) avg_duration
    ,max_rowcount,avg_rowcount,last_rowcount
FROM 
    sys.query_store_plan qp
    INNER JOIN sys.query_store_query         [q]        ON qp.query_id = q.query_id
    INNER JOIN sys.query_store_query_text    [qt]       ON q.query_text_id = qt.query_text_id
    INNER JOIN sys.query_store_runtime_stats [rs]       ON qp.plan_id = rs.plan_id
order by len(qt.query_sql_text) desc
for xml path

或者在单独的 XML 列中获取每个查询:

SELECT 
TOP 100
    qp.last_execution_time [qp__last_execution_time],
    ( select qt.query_sql_text for xml path, type ) query_sql_text,
    len(qt.query_sql_text) sql_length,      
    round(rs.avg_duration ,5) avg_duration
    ,max_rowcount,avg_rowcount,last_rowcount
FROM 
    sys.query_store_plan qp
    INNER JOIN sys.query_store_query         [q]        ON qp.query_id = q.query_id
    INNER JOIN sys.query_store_query_text    [qt]       ON q.query_text_id = qt.query_text_id
    INNER JOIN sys.query_store_runtime_stats [rs]       ON qp.plan_id = rs.plan_id

order by len(qt.query_sql_text) desc

或者从 SSMS 中的 XEvents UI 获取查询文本。

于 2017-12-08T18:55:56.407 回答