AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 207684
Accepted
Del Lee
Del Lee
Asked: 2018-05-24 17:54:19 +0800 CST2018-05-24 17:54:19 +0800 CST 2018-05-24 17:54:19 +0800 CST

这个查询来自哪里?

  • 772

我在 SQL 2017 上启用了查询存储,我看到在SELECT *特定表上经常发生的查询。

我想缩小此请求的来源范围,看看我们是否可以找到比执行SELECT *.

当然,我有一个来自查询存储的查询 ID。我最近还要求我的开发人员在他们的连接字符串中包含应用程序名称,许多人已经这样做了。

有没有一种方法(例如,可能使用 DMV)我可以找出与此查询关联的应用程序名称?

sql-server-2017 query-store
  • 1 1 个回答
  • 755 Views

1 个回答

  • Voted
  1. Best Answer
    Hannah Vernon
    2018-05-25T12:37:46+08:002018-05-25T12:37:46+08:00

    在查询存储 DMV 中查询查询哈希,然后在扩展事件会话中使用该查询哈希来捕获相关详细信息。

    这应该让你到那里:

    SELECT qsq.query_hash
        , qsqt.query_sql_text
    FROM sys.query_store_query qsq
        INNER JOIN sys.query_store_query_text qsqt ON qsq.query_text_id = qsqt.query_text_id
    WHERE qsqt.query_sql_text LIKE '%some-pertinent-SQL%';
    

    在上面的查询中,我有LIKE '%some-pertinent-SQL%'- 这会限制查询结果以匹配您要查找的目标 - 您需要将 替换为some-pertinent-SQL目标查询的唯一部分。

    query_hash在扩展事件会话定义中使用上面返回的列中的值:

    CREATE EVENT SESSION [t] ON SERVER 
    ADD EVENT sqlserver.sql_statement_completed(
        ACTION(sqlserver.client_app_name
        , sqlserver.client_hostname
        , sqlserver.nt_username
        , sqlserver.plan_handle
        , sqlserver.query_hash)
        WHERE ([sqlserver].[query_hash]=(0x00000000))
        )
    ADD TARGET package0.ring_buffer
    WITH (STARTUP_STATE=OFF);
    GO
    

    将 替换0x00000000为实际的查询哈希值。

    启动扩展事件会话:

    ALTER EVENT SESSION [t] ON SERVER 
    STATE = START;
    

    右键单击对象资源管理器中的扩展事件会话,以查看有关客户端主机名、用户名等的详细信息,以便查询发生时。

    在此处输入图像描述

    为了对此进行测试,我在我的 SQL Server 2016 测试实例上执行了以下代码:

    CREATE DATABASE QueryStoreTest
    ON PRIMARY 
    (
          NAME = QueryStoreTest_primary
        , FILENAME = 'C:\temp\QueryStoreTest_primary.mdf'
        , SIZE = 100MB
        , FILEGROWTH = 100MB
        , MAXSIZE = 1000MB
    )
    LOG ON 
    (
          NAME = QueryStoreTest_log
        , FILENAME = 'C:\temp\QueryStoreTest_log.ldf'
        , SIZE = 100MB
        , FILEGROWTH = 100MB
        , MAXSIZE = 1000MB
    );
    GO
    ALTER DATABASE QueryStoreTest 
    SET QUERY_STORE = ON;
    

    在这里,我将在 QueryStoreTest 数据库中创建几个对象和一个测试查询:

    USE QueryStoreTest;
    CREATE TABLE dbo.qst
    (
        id int NOT NULL
            PRIMARY KEY CLUSTERED
            IDENTITY(1,1)
    );
    
    CREATE TABLE dbo.qst2
    (
        id int NOT NULL
            PRIMARY KEY CLUSTERED
            IDENTITY(1,1)
    );
    
    SELECT *
    /*  test query store query  */
    FROM dbo.qst
        LEFT MERGE JOIN dbo.qst2 on qst.id = qst2.id;
    

    在这里,我将从查询存储中获取查询哈希:

    SELECT qsq.query_hash
        , qsqt.query_sql_text
    FROM sys.query_store_query qsq
        INNER JOIN sys.query_store_query_text qsqt ON qsq.query_text_id = qsqt.query_text_id
    WHERE qsqt.query_sql_text LIKE '%test query store query%';
    

    结果:

    ╔════════════════════╦════════════════════════════ ════════════════════════════╗
    ║ query_hash ║ query_sql_text ║
    ╠════════════════════╬════════════════════════════ ════════════════════════════╣
    ║ 0x3A0100223AD74766 ║ SELECT * /* test query store query */ FROM dbo.qst ║
    ║ ║ 在 qst.id = qst2.id 上左合并连接 dbo.qst2 ║
    ╚════════════════════╩════════════════════════════ ════════════════════════════╝
    

    现在,我将创建扩展事件会话:

    CREATE EVENT SESSION [t] ON SERVER 
    ADD EVENT sqlserver.sql_statement_completed
    (
        ACTION (
              sqlserver.client_app_name
            , sqlserver.client_hostname
            , sqlserver.nt_username
            , sqlserver.plan_handle
            , sqlserver.query_hash
        )
        WHERE ([sqlserver].[query_hash]=(0x3A0100223AD74766))
    )
    ADD TARGET package0.ring_buffer
    WITH (STARTUP_STATE=OFF)
    GO
    

    并开始会话:

    ALTER EVENT SESSION [t] ON SERVER 
    STATE = START;
    

    现在,如果我运行测试查询并查看会话中的实时数据,我会看到:

    在此处输入图像描述

    清理:

    USE master;
    GO
    ALTER EVENT SESSION [t] ON SERVER 
    STATE = STOP;
    GO
    DROP EVENT SESSION [t] ON SERVER;
    GO
    ALTER DATABASE QueryStoreTest SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
    DROP DATABASE QueryStoreTest;
    
    • 6

相关问题

  • SQL Server 查询存储 - 什么被视为“临时”查询?

  • SQL Server 2017:批处理模式内存授予反馈如何工作?

  • SQL Server 2017:批处理模式自适应联接如何工作?

  • 我无法访问任何数据库图

  • 无法在 Ubuntu 16.04 上启动 SQL Server

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve