小编db2*_*db2的帖子

为通过 sp_executesql 调用的查询创建计划指南

长话短说,我有一个名为 vwRelatives 的视图,它使用 CTE 递归来构建家谱。它旨在一次查询一个人。

这在大约四分之一秒内运行:

SELECT * FROM vwRelatives WHERE person_id = 5
Run Code Online (Sandbox Code Playgroud)

这(从应用程序执行查询的方式)大约需要 4.5 秒:

exec sp_executesql N'SELECT * FROM vwRelatives WHERE person_id = @P1',N'@P1 int',5
Run Code Online (Sandbox Code Playgroud)

(请注意,我已经稍微简化了查询。真实的东西有一个显式的列列表和一个ORDER BY,但WHERE语义是相同的。我在任何一个版本中都得到了相同的症状。)

最有可能的是,SQL Serverperson_id = 5在为第一个查询创建执行计划时能够将其考虑在内,但对其进行参数化会导致运行整个视图,然后按 person_id进行过滤。

所以我想我会创建一个计划指南。现在我有两个问题。

这些是我正在采取的步骤,但似乎没有任何效果。

首先,运行“好”查询以将其放入计划缓存...

SELECT * FROM vwRelatives WHERE person_id = 5
Run Code Online (Sandbox Code Playgroud)

...然后执行标准步骤将其变成计划指南...

--Get the 'good' plan
SET @xml_showplan = (
    SELECT query_plan
    FROM sys.dm_exec_query_stats AS qs 
        CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
        CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012 plan-guides

5
推荐指数
1
解决办法
1404
查看次数

优雅地处理 T-SQL 代码中的“类枚举”幻数

我们运行 Dynamics GP,任何处理过 GP 的人都会熟悉它的所有“幻数”列,这些列代表应用程序内的各种枚举值。例如,报告查询可能如下所示:

...
WHERE sod.SOPTYPE = 2
    AND iv.VCTNMTHD = 3
    AND pod.POLNESTA IN (2, 3)
Run Code Online (Sandbox Code Playgroud)

......这与自我记录尽可能远。

起初我有一个聪明的想法,即创建一个名为“Enums”的表,用值填充它,并制作一个标量包装函数,这样你就可以像这样查询:

...
WHERE sod.SOPTYPE = Enum('Sales Doc Type', 'Order')
    AND iv.VCTNMTHD = Enum('Valuation Method', 'Average Perpetual')
    AND pod.POLNESTA IN (Enum('PO Line State', 'Released'), Enum('PO Line State', 'Change Order'))
Run Code Online (Sandbox Code Playgroud)

当然,这很糟糕,因为优化器无法看到潜在的“常量”值,因此做出了一些相当糟糕的选择,因为它必须进行基数猜测。

所以它需要是代码中的实际常量值,但我不确定 SSMS 中是否有任何很好的功能可以使这种事情变得容易。我可以(错误地)以某种方式使用代码片段或模板吗?如果我们可以进行某种查找/插入来使我们的代码看起来像这样,那就太棒了:

...
WHERE sod.SOPTYPE = /*Order*/2
    AND iv.VCTNMTHD = /*Average Perpetual*/3
    AND pod.POLNESTA IN (/*Released*/2, /*Change Order*/3)
Run Code Online (Sandbox Code Playgroud)

我也不反对检查 SSMS 加载项。

sql-server ssms t-sql enum

5
推荐指数
1
解决办法
1233
查看次数

Management Studio 2012 向后兼容性

任何尝试过这个的人的两个快速问题:

  1. Management Studio 2012 是否会与 Management Studio 2008 等一起安装和运行?我依稀记得在 2008 年和 2005 年无法做到这一点。

  2. Management Studio 2012 是否完全支持连接和管理 SQL Server 2008?Intellisense 是否仍然适用于旧版本?

sql-server sql-server-2012 sql-server-tools

4
推荐指数
1
解决办法
4300
查看次数

错误 229(权限被拒绝)的即时电子邮件警报

出于一些原因,我希望将所有权限被拒绝的错误(编号 229)通过电子邮件发送给我。检查 master.sys.messages 显示此错误的 is_event_logged 为 0。因此,排除使用依赖 SQL Server 错误日志的 SQL Server 代理错误警报(我已经测试过 - 我没有收到警报)。

我想我会查看 mssqlsystemresource 并查看 sys.messages 的视图定义,想也许我可以为相关消息更新 is_event_logged。但是这个视图从 获取系统错误消息OpenRowset(TABLE SYSERRORS),所以这是不行的。

有没有一种相当简单的方法可以让我立即(或在 30 秒内)通过电子邮件将所有 229 个错误发送给我,而不会损害服务器性能?电子邮件之间 60 秒的冷却时间也可能是一个好主意。

sql-server-2008 sql-server

3
推荐指数
1
解决办法
684
查看次数