我刚刚开始在 SQL Server 2016 中使用查询数据存储,它确实非常有用。我遇到的问题是,服务器上有许多服务正在监视服务代理队列,因此它们的 WAITFOR 语句始终在报告中显示为运行时间最长的查询。这本身不是问题,但它们运行的时间太长,以至于扭曲了报告上的持续时间轴,使得所有其他查询几乎不可见。
有什么方法可以让查询存储忽略查询,这样它就不会显示在报告中吗?
启用查询存储后,如何查找执行查询的人。例如,在跟踪收集的情况下,TRC 文件将获取主机名和程序详细信息以供查询,而在扩展事件的情况下,我们有 XEL 文件将获取主机名和程序详细信息。我们尝试了代码
SELECT des.program_name,
des.host_name,
*
FROM sys.query_store_query_text qt -- Query Text
JOIN sys.query_store_query q ON qt.query_text_id = q.query_id -- Query Data
JOIN sys.query_store_plan qp on qp.query_id = q.query_id -- Query Plan
join sys.dm_exec_requests der on der.query_hash = q.query_hash -- Get session id for query
join sys.dm_exec_sessions des on des.session_id = der.session_id -- Session Info
order by q.last_execution_time desc
Run Code Online (Sandbox Code Playgroud)
下面的 DMV 返回查询哈希 (query_hash) 的空值,因此上面的查询没有数据
select * from sys.dm_exec_requests der
select * from sys.dm_exec_sessions des
Run Code Online (Sandbox Code Playgroud) sql-server performance monitoring sql-server-2016 sql-query-store
如何判断Azure SQL数据库是否已打开QUERY_STORE?
您可以使用以下命令启用它:
ALTER DATABASE <database_name> SET QUERY_STORE = ON;
Run Code Online (Sandbox Code Playgroud)
我认为检查数据库应该很简单,但我还没有找到诀窍.
仅供参考,我在已启用它的数据库上尝试了此命令,但该命令只返回null:
SELECT DATABASEPROPERTYEX ('<database_name>', 'QUERY_STORE')
Run Code Online (Sandbox Code Playgroud) 我在 sql server 中有两个表,我想从这些表中选择并加入一些数据。第一个表有一些客户,例如:
---------------
customer id
Dave 1
Tom 2
---------------
Run Code Online (Sandbox Code Playgroud)
和第二个表 i 购买表,其中包括最后一次购买的清单和成本以及哪个客户购买了该产品:
------------------
product date customer id
PC 1-1-2000 1
phone 2-3-2000 2
laptop 3-1-2000 1
------------------
Run Code Online (Sandbox Code Playgroud)
我想选择最后购买日期的第一张桌子(客户信息)!我尝试过左连接,但这并没有给我最后一次购买,因为客户 ID 在第二个表中不是唯一的!我如何使用 SQL 服务器查询来执行此功能?问候
问题:
我们使用实体框架(6.21)作为我们的 ORM 管理器。我们的数据库是Azure Sql 数据库。
因为某些参数化查询(在我们的应用程序中经常使用)在某些输入上运行速度很慢(在某些输入上运行 60 秒,在其他输入上运行 0.4 秒)
我们开始使用 MS SQL Management Studio 中的 QueryStore 和 QueryStore 资源管理器(MSSMS -> 对象资源管理器 -> 查询存储)调查这些查询。
我们发现,QueryStore 将两个相同的(相同的 sql 查询但不同的参数 - 参数甚至没有存储)查询存储为不同的查询(具有不同的query_id)。通过不同的查询,我的意思是表中的不同行
sys.query_store_query)。
我通过查看 QueryStore 表来检查这一点:
SELECT
qStore.query_id,
qStore.query_text_id,
queryTextStore.query_sql_text
ROW_NUMBER() OVER(PARTITION BY query_sql_text ORDER BY query_sql_text ASC) AS rn
FROM
sys.query_store_query qStore
INNER JOIN
sys.query_store_query_text queryTextStore
ON qStore.query_text_id = queryTextStore.query_text_id
Run Code Online (Sandbox Code Playgroud)
我无法在 MSSMS 中轻松比较这些查询的计划,因为每个查询都有其自己的关联计划。
预期行为: 我假设每次后续运行具有不同参数的相同查询都会导致:
1/ 重新使用现有计划或
2/根据传递的参数值创建另一个计划......
例子:
查询看起来像这样(实际上查询要复杂得多,因为它们是由 EntityFramework 生成的):
SELECT …Run Code Online (Sandbox Code Playgroud) sql sql-server entity-framework azure-sql-database sql-query-store
我正在对查询存储使用以下查询:
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
Run Code Online (Sandbox Code Playgroud)
我注意到的是[query_sql_text]似乎被截断了,例如,典型的语句将以以下结尾:
CAST( '20170920 00:00:00' AS datetime),CAST( '20140701 00:00:
Run Code Online (Sandbox Code Playgroud)
可能相关:
这种情况下的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)中的差异排除了超出列长度限制的情况。
这可能是怎么回事?