标签: sql-server-2012

使用 TVP 了解执行计划

我有一些运行缓慢的查询(按月分组的 100 万条记录中的 8 秒),并且一直试图理解执行计划。我们使用大约 10 个 TVP 来发送一组用户选择的过滤器,我有一个索引视图,占查询成本的 84%。

执行计划比较大,不能上传到这里,所以上传到这里了

我花了很多时间来尝试优化这些查询(其中有 14 个,但每个查询的核心都大同小异)并且希望任何人在阅读它们时提出建议或提示。我还实现了实际执行计划建议的查询,但查询速度慢了 5 倍?

performance sql-server execution-plan sql-server-2012 table-valued-parameters query-performance

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

事务日志备份

另一个偶然的 DBA 问题。我们有一个托管 10 个数据库的数据库实例。此数据库服务器没有设置任何维护计划。我想制定一个体面的维护计划,每天备份一次完整的数据库,每小时备份一次事务日志。我尝试单击 SSMS 中的新维护计划按钮,但似乎未配置 SQL 服务器代理。我计划通过运行以下命令来启用它

 sp_configure 'show advanced options', 1;
 GO
 RECONFIGURE;
 GO
 sp_configure 'Agent XPs', 1;
 GO
 RECONFIGURE
 GO
Run Code Online (Sandbox Code Playgroud)

然后我计划使用维护计划向导并设置我的计划。我是否遵循正确的路线>?在制定计划时我是否必须注意一些事项?感谢您的建议。谢谢

sql-server sql-server-2012

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

Sql Server 2012 更改数据捕获奇怪的行为

在我的 Sql Server 2012 中,我在数据库中有下表

CREATE TABLE [dbo].[HumanResource](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](50) NOT NULL,
    [IsHired] [bit] NULL,
    [Address] [nvarchar](max) NULL,
    [Score] [bigint] NULL,
    [LastUpdate] [datetime] NULL,
 CONSTRAINT [PK_HumanResource] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

当我更新地址字段(nvarchar,not null)时,它被捕获如下

NULL 3 2 MAHMOOD真 这里 111 2014年9月1日14:42:28.913
NULL 4 2 MAHMOOD真 111 2014年9月1日14:42:28.913

但是当我更新 Score …

sql-server-2012 change-data-capture

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

可以优化涉及 XQuery 函数的 SELECT 查询,该查询从具有任意数量子元素的元素中选择

假设我有以下 XML 数据,其中

  • <root>可以有任意数量的<child>孩子
  • <child>可以有任意数量的<grandchild>孩子
  • <grandchild>可以有任意数量的<greatgrandchild>孩子
  • <child>并且<grandchild>可以有任意数量的<parameter>孩子
  • 每个人<parameter>都有<name>一个<value>孩子
  • 深度停在曾孙(不需要任意深度)

例如,

<root name="root">
  <child name="a">
    <grandchild name="a1">
      <parameter>
        <name>param1</name>
        <value>ABC123</value>
      </parameter>
      <parameter>
        <name>param2</name>
        <value>CBC</value>
      </parameter>
      <greatgrandchild name="a1a">
        <parameter>
          <name>paramA</name>
          <value>ABC</value>
        </parameter>
        <parameter>
          <name>paramB</name>
          <value>DBC</value>
        </parameter>
      </greatgrandchild>
    </grandchild>
  </child>
</root>
Run Code Online (Sandbox Code Playgroud)

我需要做的是选择包含“_BC”的值的参数,其中 _ 是一个不是 A 的字符。

我有以下查询

SELECT
    TestId,
    [root],
    child,
    grandchild,
    NULL AS greatgrandchild,
    parameter
FROM (
        SELECT
            TestId,
            [root].a.value('@name', 'varchar(max)') AS …
Run Code Online (Sandbox Code Playgroud)

xml sql-server sql-server-2012 xquery

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

SQL Server 链权限

我们有 2 个数据库。

  • 报告
  • 人力资源

有一些用户想要从 HR 数据库中提取数据。但我们不想直接访问该 HR 数据库。

因此,我们在 Reporting 数据库中创建了特殊视图,并且用户拥有该 Reporting 数据库的dbowner权限。

但是,当他们尝试运行查询时,错误消息显示...

The server principal "test" is not able to access the database "HR" under the current security context. 
Run Code Online (Sandbox Code Playgroud)

当我授予他们作为HR 数据库的db_datareader阅读器时,一切都很好,他们可以运行查询。但它破坏了安全性,我们不希望他们直接访问 HR 数据库。这就是我们在报告数据库中制作特殊视图的原因。

如何让这些用户在不直接访问 HR 数据库的情况下运行视图/查询?

sql-server permissions access-control sql-server-2012 signature

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

SQL Server 命中 System.OutOfMemoryException 但服务器有 10GB 可用空间

SQL Server 2012 11.0.5058.0

我正在运行大量查询(大约 2700 个)来模拟用户在我们的应用程序中执行 X、Y 和 Z。我将 SQL Server 的最大内存设置为 2147483647 MB​​。但是,当我运行查询时,我收到几条消息,如下所示:

An error occurred while executing batch. Error message is: Exception of type 'System.OutOfMemoryException' was thrown.

当我查看服务器时,它有 20GB 的空闲内存,而 SQL Server 只使用了 4.8GB(而且这个数字是稳定的)。

我试过放入一些GO语句无济于事。我不知道它在哪里遇到内存问题。没有一个查询返回多于几行。

我怎样才能解决这个内存问题?

sql-server sql-server-2012

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

设置 READ_Write 的含义

我希望更新READ_ONLY数据库上的几个用户。
由于数据库在全球范围内 24/7 全天候使用,并且维护窗口刚刚过去,我想在活动量低的时刻执行此操作(以便能够遵守截止日期)。

我目前正在考虑使用:

USE MASTER
GO
ALTER DATABASE SQL SET READ_WRITE
GO
USE SQL
GO
EXEC sp_addrolemember N'db_datareader', N'USER'
GO
USE MASTER
GO
ALTER DATABASE SQL SET READ_ONLY
GO
Run Code Online (Sandbox Code Playgroud)

但是我想:

  1. 保证这不会无限期地挂起
  2. 确保在此操作期间不能将任何内容写入数据库

由于我无法将这些命令放入事务中,而且我在 DEV 或 STG 环境中没有方便的应用程序服务器来预先测试更改,是否有任何有关更改read_only单个操作状态的文档?(我确实测试了 T-SQL 语句,并且它们有效)

另外,由于这需要对数据库进行排他锁,我什至有可能通过我的语句吗?

我倾向于只是提出这将不得不等到下一个维护窗口期间。但我希望这里有人能证明我错了。

sql-server t-sql sql-server-2012 locking read-only-database

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

将数据库从 SQL Server 2005 升级到 2012 发现语法错误

我最近从 SQL Server 2005 升级到 2012。但是在验证过程中,发现了一个错误。

某个触发器的编码如下:

CREATE TRIGGER [dbo].[trigger] on [dbo].[foo]
FOR UPDATE, UPDATE
AS
    UPDATE foobar
    SET datetime = GetDate()
    FROM bar
    WHERE foobar.id = bar.id
GO
Run Code Online (Sandbox Code Playgroud)

我可以在 SQL Server 2005 上安全地执行这个(奇怪的)。

但是,在 SQL Server 2012 上,它会引发(我所期望的)语法错误。

语法错误:触发器声明中操作“UPDATE”的重复规范。

为什么这不会在 SQL Server 2005 上引发语法错误?我在这方面的 google-fu 失败了。

为什么这似乎适用于 SQL Server 2005?

trigger sql-server-2005 syntax sql-server-2012

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

有什么方法可以跟踪谁在执行什么查询?谁来过我的草坪?

我有一个数据库,其中大多数表对于一个特定安全组中的用户都是可读的。

我知道大多数用户来自我的团队,但最近我发现越来越多的人使用它,并且大部分执行都来自 Excel 和/或 Access。

出于好奇,有什么方法可以让我跟踪谁访问了 SQL 服务器以及他们正在运行什么查询?

sql-server sql-server-2012

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

在数据库中查找特定单词

目标

在数据库中的表中定位特定单词并在列表中显示表和列的名称。

问题

有太多表无法定位数据库中的特定单词。

信息

  • 使用 SQL Server 2012
  • 每个表都使用一个“schemaname.tablename”

sql-server t-sql sql-server-2012 string-manipulation

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