标签: sql-server

将查询计划按语句拆分以实现可重用性会更好吗?

根据我对查询如何编译、存储和检索查询计划的有限了解,我了解多语句查询或存储过程将生成它的查询计划,该查询计划将存储在查询计划缓存中,以供查询在未来执行中使用。

我认为这个计划是通过查询哈希从查询计划缓存中检索的,这意味着如果查询被编辑和执行,哈希是不同的,并且会生成一个新计划,因为在查询计划缓存中找不到匹配的哈希。

我的问题是:如果用户执行的语句是多语句查询中的语句之一,它是否可以将缓存中已有的查询计划的相关部分用于多语句查询?我希望答案是否定的,因为哈希值显然不匹配,但是在多语句查询中对每个语句进行哈希处理是否更好,以便用户可以从查询中运行单个语句来使用它们?

我希望有一些我没有考虑到的并发症(我真的很想知道这些),但似乎我们可以在许多查询计划中存储相同的“语句计划”,占用更多空间和更多CPU 和生成时间。

可能只是显示我的无知。

sql-server execution-plan plan-cache

11
推荐指数
1
解决办法
361
查看次数

使用xml参数插入多个数据时如何避免使用Merge查询?

我正在尝试使用一组值更新表。数组中的每一项都包含与 SQL Server 数据库表中的行匹配的信息。如果该行已存在于表中,我们将使用给定数组中的信息更新该行。否则,我们在表中插入一个新行。我已经基本上描述了 upsert。

现在,我试图在采用 XML 参数的存储过程中实现这一点。我使用 XML 而不是表值参数的原因是,执行后者时,我必须在 SQL 中创建自定义类型并将此类型与存储过程相关联。如果我以后更改了存储过程或数据库架构中的某些内容,则必须重做存储过程和自定义类型。我想避免这种情况。此外,TVP 相对于 XML 的优势对我的情况没有用,因为我的数据数组大小永远不会超过 1000。这意味着我不能使用这里提出的解决方案:How to insert multiple records using XML in SQL server 2008

此外,这里的类似讨论(UPSERT - 是否有更好的替代 MERGE 或 @@rowcount?)与我所问的不同,因为我试图将行插入到表中。

我希望我可以简单地使用以下一组查询来更新 xml 中的值。但这行不通。当输入是单行时,这种方法应该有效。

begin tran
   update table with (serializable) set select * from xml_param
   where key = @key

   if @@rowcount = 0
   begin
      insert table (key, ...) values (@key,..)
   end
commit tran
Run Code Online (Sandbox Code Playgroud)

下一个替代方法是使用详尽的 IF EXISTS 或其以下形式的变体之一。但是,我以次优效率为由拒绝了这一点:

IF (SELECT COUNT ... ) > 0 …
Run Code Online (Sandbox Code Playgroud)

xml sql-server stored-procedures t-sql upsert

11
推荐指数
1
解决办法
1万
查看次数

在提交事务之前查询数据

我的理解是,在 MS SQL Server Management Studio 窗口中,在执行“开始事务”然后进行一些更改(例如将数据添加到表)之后,您只能从同一窗口查询该表和这些更改,直到您执行“提交交易”。

在执行“提交事务”之前,有什么方法可以从其他来源进行查询?

具体到我当前的目标并添加一些上下文。我从 Excel Power Query 执行一些 SQL 查询。我真的很希望能够在“提交事务”之前执行这些查询,以便我可以进行一些分析并确定是否应该进行回滚而不是提交。

sql-server ssms transaction

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

SQL Server:向视图中的用户授予选择访问权限,而不是其表中的用户

我有一个带有几个数据库的 SQL Server 2012 实例。在其中一个中,我创建了一个视图,它选择的不仅仅是数据库中的表。

我希望用户能够选择该视图,但不能选择其表。创建视图正是因为用户无法选择表。

我已阅读/sf/ask/25789011/http://msdn.microsoft.com/en-us/library/ms188676。 aspx,但它仍然无法正常工作。

如果我GRANT SELECT TABLE TO USER对所有表执行 a ,用户就可以选择视图。但是如果我撤销到任何表,它就会失败。

这应该是一个简单的过程,但我无法让它工作。我以前见过它发生过(实例的所有者让我访问视图,但没有对它的表执行此操作)但我无法执行此操作或找到知道如何操作的人。

有人可以为我提供有关如何操作的教程或代码示例吗?


当用户SELECTs查看我收到的消息时:

对象<TABLE>、数据库<DB>、架构的 SELECT 权限被拒绝dbo

如果我授予该表的选择权,错误消息会将表名更改为视图读取的另一个表。

schema sql-server permissions

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

如何让 SSMS 像 SSDT 一样在 sqlcmd 模式下使用 :r 使用当前脚本的相对路径?

如果我在同一个文件夹中有 foo.sql 和 bar.sql,则 foo.sql 在 sqlcmd 模式下从 SSDT 运行时可以引用 bar.sql :r ".\bar.sql"。但是,SSMS 不会找到它。Procmon 显示 SSMS 正在寻找%systemroot%\syswow64

带注释的 Procmon 屏幕截图

如何告诉 SSMS 在不显式声明路径的情况下查看当前脚本保存到的文件夹?

sql-server ssms sqlcmd ssdt

11
推荐指数
2
解决办法
5153
查看次数

错误:无法生成 SSPI 上下文

当有人尝试连接到 SQL Server 实例时,会显示错误:

不可能生成 SSPI 上下文。

昨天我们停电了(不知道这个用英语怎么说),我不得不关闭我们的服务器。

寻找答案,我发现了这个:

SQL Server 2008 连接问题:无法生成 SSPI 上下文

但这对我没有帮助,因为直到昨天它们都工作正常。我不想改变任何东西。但如果有必要,我会改变它。

Obs:我现在无法重新启动服务器。


编辑:自从我回答以来,我们没有任何错误。

sql-server-2008 authentication sql-server errors connectivity

11
推荐指数
2
解决办法
12万
查看次数

高 PAGELATCH_* 和 WRITELOG 等待。他们有关系吗?

我们看到非常高的 PAGELATCH_EX 和 PAGELATCH_SH 等待类型以及高 WRITELOG 等待。我已经诊断出导致 PAGELATCH 等待的查询,并且可以通过降低插入到使用 IDENTITY 值定义的繁忙集群主键的插入率来消除它们。我知道这种现象被称为最后一页插入闩锁争用。

但是我的问题是,当插入新记录时,SQL Server 是否在缓冲页上取独占 PAGELATCH_EX,将记录​​插入缓冲页,将记录写入事务日志,然后按详细https://释放独占 PAGELATCH_EX www.microsoft.com/en-ie/download/details.aspx?id=26665 Page 24. 还是先将记录写入事务日志,然后再将 PAGELATCH_EX 作为详细的“Resolving PAGELATCH Contention on High Concurrent”INSERT Workloads -背景信息SQLCAT 的指南:关系引擎

如果记录是在闩锁机制之外写入日志,那么我可以排除由于高 PAGELATCH 等待而导致的缓慢写入磁盘的情况。但是,如果锁存器一直保持到记录被强化记录,那么我可能应该考虑 WRITELOG。

也有多个非聚集索引会导致 PAGELATCH_* 锁存器保持更长时间,即如果一个表有一个聚集和多个非聚集索引,同时向每个索引缓冲区页添加和释放锁存器?

更新 1 阅读confio-sql-server-writelog-wait幻灯片二和一般 WAL 架构后。我现在了解到,两份白皮书中详述的“记录该行已被修改的日志条目”步骤是指 SQL Server 记录事务日志缓存中的更改,而不是磁盘。一旦事务完成或缓冲区已满,所有记录都会立即刷新到磁盘。

sql-server sql-server-2008-r2 database-internals sql-server-2012 sql-server-2014

11
推荐指数
1
解决办法
1522
查看次数

优化超过 25 万行的查询

我正在使用 MS SQL,我必须根据不同的条件在同一个表上运行多个查询。起初我在原始表上运行每个查询,尽管它们都共享一些过滤器(即日期、状态)。这花了很多时间(大约 2 分钟)。

数据行中有重复项,所有索引都是非聚集的。我只对我的标准的 4 列感兴趣,结果应该只输出所有查询的计数。

需要的列:TABLE, FIELD, AFTER, DATE, 并且每个DATE和上都有一个索引TABLE

在创建一个只有我需要的字段的临时表后,它下降到 1:40 分钟,这仍然很糟糕。

CREATE TABLE #TEMP
(
    TABLE VARCHAR(30) NULL,
    FIELD VARCHAR(30) NULL,
    AFTER VARCHAR(1000) NULL,
    DATE DATETIME,
    SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)

INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
    SELECT TABLE, FIELD, AFTER, DATE 
    FROM mytbl WITH (NOLOCK)
    WHERE TABLE = 'OTB' AND
    FIELD = 'STATUS'
Run Code Online (Sandbox Code Playgroud)

运行此 ->(216598 行受影响)

由于并非所有查询都依赖于日期范围,因此我没有将其包含在查询中。问题是只插入. …

performance sql-server sql-server-2012 performance-tuning

11
推荐指数
2
解决办法
8万
查看次数

验证现有用户的密码策略

我最近进入了一个环境,其中许多数据库登录都没有enforce_password_policy启用该标志。
即将进行的审计需要验证这些登录的密码。

我使用以下查询来获取登录列表以及标志是打开还是关闭。

select 
    @@SERVERNAME as servername, 
    name, 
    IS_SRVROLEMEMBER('sysadmin', name) as SYSADMIN,
    type_desc,
    create_date,
    is_policy_checked,
    is_disabled,
    password_hash,
    PWDCOMPARE(name, password_hash) as UsernameAsPassword
FROM sys.sql_logins
Run Code Online (Sandbox Code Playgroud)

但是,这并不能告诉我密码是否确实符合密码策略,因为该标志仅在创建用户时相关。

是否有已知的方法来测试现有用户的密码策略合规性?
我无法访问旧密码,我更喜欢不需要它们的方法。

security sql-server sql-server-2008-r2 password

11
推荐指数
1
解决办法
2万
查看次数

具有只读应用程序意图的 SSMS 注册服务器

我们正在使用 AlwaysOn 进行 SQL Server 2014 POC 测试,其中一位用户询问是否使用本地服务器组中的注册服务器保存具有只读意图的 SSMS 配置。这样他们就不必在每次需要访问只读副本时都输入别名。

不幸的是,与常规对象浏览器不同,注册服务器中没有选项可以添加 ApplicationIntent 选项。

我从 Microsoft 看到了这篇关于更改 RegSrvr.xml 中的连接字符串的文章。

https://connect.microsoft.com/SQLServer/feedback/details/786323/ssms-sql-server-management-studio-2012-missing-connection-properties-for-availability-groups

我尝试了他们的建议,但在通过注册服务器中的本地服务器连接时,它没有连接到正确的副本节点。

使用连接窗口 > 附加连接参数中的选项时,对象资源管理器中的只读选项工作正常。但它不会保存对连接所做的更改。

有没有人知道使用 SSMS保存具有只读意图属性的配置的任何替代解决方案?在此先感谢您的帮助。

sql-server ssms availability-groups sql-server-2014

11
推荐指数
2
解决办法
8704
查看次数