如何将我所有选定的列放入虚拟变量中?

2024-04-14

背景

这个问题是一个后续问题上一个问题 https://stackoverflow.com/questions/45981422/how-to-measure-query-duration-without-showing-results-of-query。为了在这里也为您提供背景信息,我想总结一下上一个问题:在上一个问题中,我打算有一种方法来执行选择而不将结果发送给客户端。目标是通过发送数百万数据来衡量性能,而不消耗大量资源。我只对执行这些查询所需的时间感兴趣,而不是他们将结果发送到客户端应用程序的时间,因为我打算优化查询,所以查询的结果根本不会改变,但方法会改变改变,我打算能够比较这些方法。

当前知识

在我的另一个问题中提出了一些想法。一个想法是选择记录的计数并将其放入变量中。但是,这显着改变了查询计划,并且结果在性能方面并不准确。也提出了使用临时表的想法,但是如果我们不知道什么查询将作为我们要测量的输入,并且还会引入大量白噪声,那么创建临时表并将其插入其中是很困难的,因此,即使想法很有创意,但对于我的问题来说并不理想。最后,弗拉基米尔·巴拉诺夫提出了一个想法,即创建与选择将返回的列一样多的变量。这是一个好主意,但我通过创建 nvarchar(max) 的单个变量并将所有列选择到其中来进一步完善它。除了一些问题之外,这个想法非常有效。我有大多数问题的解决方案,但我想分享它们,所以,我无论如何都会描述它们,但不要误解我,我有一个问题。

Problem1

如果我有一个@container变量,我做了一个@container = columnname在每个选择内,那么我都会遇到转换问题。

解决方案1

而不是仅仅做一个@container = columnname,我需要做一个@container = cast(columnname as nvarchar(max))

Problem2

我需要转换<whatever> as something into @container = cast(<whatever> as nvarchar(max))对于选择中的每一列,但不适用于子选择,我需要有一个通用的解决方案处理case when和括号,我不想有任何实例@container =任何地方,除了主选择的左侧。

解决方案2

由于我对正则表达式一无所知,因此我可以通过迭代查询字符串直到找到from的主查询,每次我找到括号时,我将不执行任何操作,直到括号关闭为止,找到其中的索引@container =应该放和as [customname]应该取出并从右到左执行查询字符串中的所有操作。这将是一段又长又不优雅的代码。

Question

是否可以确保我的所有主要专栏但没有其他内容以@container =并结束没有as [Customname]?


对于评论来说这太长了,但我想将我的 $.02 添加到其他答案中,并分享我用来测试建议方法的脚本。

我喜欢 @MartinSmith 的 TOP 0 解决方案,但担心在某些情况下它可能会导致不同的执行计划形状。我在运行的测试中没有看到这一点,但我认为您需要验证该计划与您测试的每个查询的不受干扰的查询大致相同。但是,我的测试结果表明列数和/或数据类型可能会影响此方法的性能。

@VladimirBaranov 的答案中的 SQLCLR 方法应该提供应用程序代码生成时的确切计划(假设测试的 SET 选项相同),但 SqlClient 在 SQLCLR 中消耗结果仍然会产生一些轻微的开销 (YMMV)。与将结果返回给调用应用程序相比,使用此方法的服务器开销会更少。

我在第一条评论中建议的 SSMS 丢弃结果方法将比其他方法产生更多开销,但确实包括 SQL Server 不仅在运行查询时执行的服务器端工作,而且还为返回结果填充缓冲区。是否应考虑此额外的 SQL Server 工作取决于测试的目的。对于单元级性能测试,我更喜欢使用与应用程序代码相同的 API 来执行测试。

我通过@MartinSmith 的原始查询使用这 3 种方法捕获了服务器端性能。我的机器上 1,000 次迭代的平均值为:

test method     cpu_time      duration    logical_reads
SSMS discard   53031.000000  55358.844000  7190.512000
TOP 0          52374.000000  52432.936000  7190.527000
SQLCLR         49110.000000  48838.532000  7190.578000

我对返回 10,000 行和 2 列的简单查询执行了相同的操作(int and nvarchar(100)) 来自用户表:

test method     cpu_time      duration    logical_reads
SSMS discard    4204.000000  9245.426000   402.004000
TOP 0           2641.000000  2752.695000   402.008000
SQLCLR          1921.000000  1878.579000   402.000000

重复相同的测试,但使用varchar(100)列而不是nvarchar(100):

test method     cpu_time      duration    logical_reads
SSMS discard    3078.000000  5901.023000   402.004000
TOP 0           2672.000000  2616.359000   402.008000
SQLCLR          1750.000000  1798.098000   402.000000

以下是我用于测试的脚本:

像 @VladimirBaranov 建议的 SQLCLR 过程的源代码:

public static void ExecuteNonQuery(string sql)
{
    using (var connection = new SqlConnection("Context Connection=true"))
    {
        connection.Open();
        var command = new SqlCommand(sql, connection);
        command.ExecuteNonQuery();
    }
}

Xe 跟踪捕获实际的服务器端计时和资源使用情况:

CREATE EVENT SESSION [test] ON SERVER 
ADD EVENT sqlserver.sql_batch_completed(SET collect_batch_text=(1))
ADD TARGET package0.event_file(SET filename=N'QueryTimes')
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF);
GO

用户表创建和加载:

CREATE TABLE dbo.Foo(
      FooID int NOT NULL CONSTRAINT PK_Foo PRIMARY KEY
    , Bar1 nvarchar(100)
    , Bar2 varchar(100)
    );
WITH 
     t10 AS (SELECT n FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) t(n))
    ,t10k AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT 0)) AS num FROM t10 AS a CROSS JOIN t10 AS b CROSS JOIN t10 AS c CROSS JOIN t10 AS d)
INSERT INTO dbo.Foo WITH (TABLOCKX)
SELECT num, REPLICATE(N'X', 100), REPLICATE('X', 100)
FROM t10k;
GO

从 SSMS 运行 SQL 脚本,并使用丢弃结果查询选项,使用 3 种不同的方法运行 1000 次测试迭代:

SET NOCOUNT ON;
GO

--return and discard results
SELECT v.*,
       o.name
FROM   master..spt_values AS v
       JOIN sys.objects o
         ON o.object_id % NULLIF(v.number, 0) = 0;
GO 1000

--TOP 0
DECLARE @X NVARCHAR(MAX);

SELECT @X = (SELECT TOP 0 v.*,
                          o.name
             FOR XML PATH(''))
FROM   master..spt_values AS v
       JOIN sys.objects o
         ON o.object_id % NULLIF(v.number, 0) = 0;
GO 1000

--SQLCLR ExecuteNonQuery
EXEC dbo.ExecuteNonQuery @sql = N'
SELECT v.*,
       o.name
FROM   master..spt_values AS v
       JOIN sys.objects o
         ON o.object_id % NULLIF(v.number, 0) = 0;
'
GO 1000

--return and discard results
SELECT FooID, Bar1
FROM   dbo.Foo;
GO 1000

--TOP 0
DECLARE @X NVARCHAR(MAX);

SELECT @X = (SELECT TOP 0 FooID, Bar1
             FOR XML PATH(''))
FROM   dbo.Foo;
GO 1000

--SQLCLR ExecuteNonQuery
EXEC dbo.ExecuteNonQuery @sql = N'
SELECT FooID, Bar1
FROM   dbo.Foo
';
GO 1000

--return and discard results
SELECT FooID, Bar1
FROM   dbo.Foo;
GO 1000

--TOP 0
DECLARE @X NVARCHAR(MAX);

SELECT @X = (SELECT TOP 0 FooID, Bar2
             FOR XML PATH(''))
FROM   dbo.Foo;
GO 1000

--SQLCLR ExecuteNonQuery
EXEC dbo.ExecuteNonQuery @sql = N'
SELECT FooID, Bar2
FROM   dbo.Foo
';
GO 1000
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将我所有选定的列放入虚拟变量中? 的相关文章

  • 动态版本控制

    我有一种情况 我希望版本控制在构建时是动态的 版本图案
  • Id 或 [TableName]Id 作为主键/实体标识符

    是否首选使用 Id 作为主键的列名或 TableName Id 作为命名约定 表 账户主键 ID 相对 表 账户主键 AccountId 在我见过的实现中 它似乎分为 50 50 左右 每种方法的优点和缺点是什么 跟进 在我的数据库中使用一
  • SQL SERVER 中的排序依据和大小写

    我需要在存储过程中按功能排序 一个值被发布到网络服务 并且基于该值我必须以某种方式对结果进行排序 即 当 ColName 按 ColName 发布订单时 当 ColName2 由 ColName2 发布订单时 我正在研究使用 Case 但出
  • 使用 Python 中的 SQL Server 存储过程 (pyodbc)

    我有一个存储过程 代码 DECLARE RC int DECLARE id varchar 13 DECLARE pw varchar 13 DECLARE depart varchar 32 DECLARE class varchar 1
  • 无法在 SSIS 2012 上使用敏感项目参数

    在 SSIS 2012 中 我尝试对 Oracle 的 OLEDB 连接使用敏感项目参数 它与 Sensitive 属性设置为完美配合FALSE 在项目参数设计器中 但我不希望密码像那样可见 一旦我将敏感属性设置为TRUE并尝试执行我的包
  • 使用 VB.NET 检查 Word 文档中的字体样式

    我想使用vb net检查一个word文件 并检查文档中的样式是否正确 我必须在word文档中检查这些表达式 a Verdana 16 pt Bold Red b Verdana 12 pt Bold Italic Blue c Verdan
  • VB - 如何读取和写入二进制文件?

    如何从任何文件读取原始字节数组 Dim bytes as Byte 然后将该字节数组写回到新文件中 我需要它作为字节数组来在两者之间进行一些处理 我目前正在使用 To read Dim fInfo As New FileInfo dataP
  • PDO SQLSRV 和 PDO MySQL 在获取 int 或 float 时返回字符串

    当您获取时 PDO MS SQL Server 和 PDO MySQL 都会返回一个字符串数组 即使列的 SQL 类型本应是数字类型 例如 int 或 float 我设法解决了这个问题 但我想了解为什么它们一开始就这样设计 是不是因为PDO
  • 连接两个表的查询的 SQL Server“FOR XML”输出

    我是 SQL Server 中 FOR XML 功能的新手 我正在使用 SQL Server 2012 我有两个表 Word 和 Word Expansion 样本数据 表 字 WordOID Word 1 PIPE 2 WIRE 表 Wo
  • 如何在SSRS 2012中显示基于总金额的前10名

    我只需要显示前 10 名Class基于Total SUM Premium 柱子 我转到类代码属性组 gt 过滤器并按 SUM Net Written Premium 设置前 10 名 但它不起作用 我只需要显示前 10 名 而且总金额也应该
  • 在 SQL Server 中处理日期

    我正在开发一个 ASP NET 网站 我从网页获取日期 然后根据用户输入我想从 SQL Server 数据库获取结果 使用存储过程 问题是我只能从用户界面获取这种格式的日期2016 10 08这是字符串类型 但在数据库中 我有一个类型为da
  • 某些笔记本电脑中的 VB.net Forms UI 显示问题

    我是 VB 应用程序的新手 无法弄清楚我的应用程序出了什么问题 有一个带有几个标签和文本字段的表单 当我在我和其他人的机器上运行该应用程序时 它显示良好 并具有正确的对齐和字体 然而 对于某些人来说 应用程序表单 UI 是破碎的 未对齐的文
  • 如何在存储过程中实现 sql 搜索功能 (Sql Server 2008)

    我需要编写一个存储过程 该过程将使用 sql server 2008 根据可选参数搜索表 将会有两种模式 基本搜索模式 我们只传递一些文本 高级搜索模式 使用可选参数而不使用 SearchText 为了进行测试 我使用 AdventureW
  • 对多个数据库执行 SQL 查询

    我知道我的帖子与该论坛中的其他帖子的标题非常相似 但我真的找不到我需要的答案 这是我的问题 我的 Windows Server 上运行着 SQL Server 在我的 SQL Server 中 我有大约 30 个数据库 它们都具有相同的表和
  • 在 C#.NET 应用程序中使用 SQL Server 时间数据类型?

    如何使用 SQLtimeSQL Server 2008 中 C NET 中引入的数据类型 我一直在努力让它发挥作用 但没有成功 这是一个MSDN 文章 http msdn microsoft com en us library bb6751
  • C#的数组列表可以用来填充SSIS对象变量吗?

    我已在 C 脚本中填充了一个列表 并将其值分配给 SSIS 对象变量 然后 我使用该对象变量通过循环遍历 For every do 枚举器来执行一些 SQL 查询 我尝试通过 Foreach ado 枚举器执行此操作 但出现错误 X 变量不
  • 将表数据从一个 SQL Server 导出到另一台 SQL Server

    我有两个 SQL Server 都是 2005 版本 我想将多个表从一个表迁移到另一个表 我努力了 在源服务器上 我右键单击数据库 选择Tasks Generate scripts 问题是在下面Table View options没有Scr
  • 可以获取SQL Server中当前执行的存储过程的行号吗?

    几年前 我在 Sybase Delphi 环境中工作 使用 BDE 连接到数据库服务器 我们有一个 Delphi 小应用程序 给定当前正在执行的存储过程的名称 它可以告诉您当前正在执行该存储过程的哪一行 这对于调试似乎挂起的存储过程非常有用
  • Visual Studio 2010 中的数据库设计器

    我需要创建一个全新的 Sql Server 2008 数据库 并希望使用 Visual Studio 2010 Ultimate 中的数据库项目 我已经创建了该项目并在下面添加了一个表格dbo架构 桌子 sql仅以纯文本形式显示 但带有颜色
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个

随机推荐