标签: sql-server-2012

将表 UDT 传递给表函数时强制执行正确的执行计划

我有一个标量函数,它返回一个大的 XML,它是通过一堆发票创建的。

可以使用几种不同的方法计算要提供给函数的确切发票列表,但函数每次都是相同的。出于这个原因,我声明了一个用户定义的表类型来包含表中的主键eInvoice.Header并将其传递给函数。这样我就可以有几个不同的函数来决定要处理哪些发票,并且只有一个函数可以实际生成 XML:

create function eInvoice.GetRelevantLinesInOneWay()
returns table ...

create function eInvoice.GetRelevantLinesInAnotherWay()
returns table ...

create function eInvoice.GetXML(@lines eInvoice.InvoicePrimaryKeys readonly)
returns xml
as
begin
    declare @x xml;

    with xmlnamespaces(N'important namespace' as pro)
    select @x = (
        select
            ...
        from
            eInvoice.Header h
            inner join @lines l on h.ST_PRIMARY = l.invoice_row_id
        for xml path(N'pro:Import'), type
    );

    return @x;
end;
Run Code Online (Sandbox Code Playgroud)

不幸的是,这种设置已被证明是非常脆弱的。

通常@lines包含大约 150 行(大约1min eInvoce.Header)。正确的执行计划是在 上使用索引查找ST_PRIMARY,当我将 的主体eInvoice.GetXML作为临时查询执行时,总是会发生这种情况。

然而,当我将它存储为一个函数时,它会按预期工作一段时间,然后发生了一些事情(太多行@lines,比如大约300 …

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

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

拒绝用户在 master 中创建表的权限

我注意到我可以在master数据库中创建表、模式、存储过程等。

我不知道是什么授予此权限。这很烦人,因为当我们在 SSMS 中打开一个 *.sql 文件时,它默认与master 相关。如果在CREATE没有注意到并设置正确的数据库上下文的情况下执行操作,则在master 中创建表。

如果我们没有权限,我们会得到一个错误,注意到它并更改数据库上下文。有了权限,表就创建好了,后面我们才看到错误,需要删除重新创建。我注意到在master中已经错误地创建了一些表。

我想撤销每个人类用户的许可,但我害怕破坏某些东西。我不知道某些 SQL Server 例程是否需要在那里创建的权限。

在不破坏 SQL Server 的情况下从master撤销创建权限的最佳方法是什么?

security sql-server permissions sql-server-2012 master-system-database

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

备份错误消息 3201,级别 16,状态 1,第 1 行和操作系统错误 3

当我在网络共享驱动器中进行备份时,下面提到了 TSQL。

Use DatabaseName
Go
Backup Database DatabaseName
To Disk=N'H:\DatabaseBackup\DatabaseName.bak';
Go
Run Code Online (Sandbox Code Playgroud)

我在 SSMS 中收到以下错误。

 Msg 3201, Level 16, State 1, Line 1
Run Code Online (Sandbox Code Playgroud)

无法打开备份设备'H:\DatabaseBackup\DatabaseName.bak'操作系统错误 3(系统找不到指定的路径。)。

Msg 3013, Level 16, State 1, Line 1
Run Code Online (Sandbox Code Playgroud)

BACKUP DATABASE 异常终止。

因为我已经通过这个 TSQL 检查了 'xp_cmdshell' 。run_value & config_value 如下:

name       minimum  maximum config_value    run_value
xp_cmdshell 0           1     1               1
Run Code Online (Sandbox Code Playgroud)

注意:这里H是我的网络共享。

任何建议将不胜感激。

sql-server backup sql-server-2012

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

SQL Server 在 XML 字段中选择

我需要以下情况的帮助:

在我的表 SQLServer 2012 中有一个带有 xml 值的字段,我想选择该字段中的数据并在表单列中显示结果。

图片1

<row> 
  <ID_Cota>162986</ID_Cota>
  <ID_Taxa_Plano>1000</ID_Taxa_Plano>
  <ID_Plano_Venda>1020</ID_Plano_Venda>
  <ID_Pessoa>18522</ID_Pessoa>
</row>
Run Code Online (Sandbox Code Playgroud)

谢谢你。

xml sql-server sql-server-2012 sql-server-2014

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

考虑有点重的数据库

环境信息

  • 操作系统:Windows Server 2012 R2(64 位)
  • 内存:16.00GB
  • CPU : Intel(R) Xeon(R) CPU E5-2609 @ 2.40GHz
  • SQL:Windows SQL Server 2012 标准版

简要数据库数据信息

  • 10多张表中,其中一张有varbinary(max)类型的列
  • 该表有超过1m的记录,每列都有缩略图数据,大约占20k

简表规格

  • 表名:注册缩略图
  • 列名:UserId、ThumbData、已创建、已更新
  • 列类型:int、varbinarymax、datetime、datetime
  • 已用空间信息:行:1,034,300 | 保留:34,092,160 KB | 数据:34,054,872 KB | 索引大小:31040 KB | 未使用:6248 KB

询问

SELECT * FROM RegisteredThumbnail WHERE UserId = 512315
Run Code Online (Sandbox Code Playgroud)

此查询需要大约 6:45 分钟才能获取预期的行。

为了克服这个问题,索引是我唯一的选择吗?

通过将二进制数据替换为图像 url 作为字符串数据来更改图像数据的存储方式会有很大帮助吗?

由于这是当前的操作系统,因此更改列并不是一个好主意。

任何想法将不胜感激。

尚未配置索引。

performance sql-server sql-server-2012 query-performance

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

登录 Always On 可用性组

我是 Always On Availability Groups 的新手,我对创建登录名有点困惑。

让我们假设一个环境 NODE1(Primary) & NODE2(secondary) & NODE3(Stand by) & VAEWI(Listener)。

  1. 我需要创建一个 SQL 身份验证登录。

    为此,我假设我需要通过连接到将在所有节点中同步的侦听器来创建它。

  2. 我需要创建一个 Windows 身份验证。

    为此,我认为,因为所有节点在创建可用性组之前都是窗口集群的。因此,我们需要在主节点中创建一个 Windows 用户 1st,然后通过连接到侦听器来创建 Windows 身份验证。

谁能告诉我我的假设是否正确?

sql-server sql-server-2012 availability-groups sql-server-2014

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

TSQL 2012 删除了 INSTEAD OF 和 AFTER 触发器中的表?

我的同事问我很简单,但对我来说很难的问题:

如果我deletedINSTEAD OF触发器中有 10 条记录的表并且我删除了其中的 8 条记录,那么我deletedAFTER触发器中的表中有多少条记录?

我认为它应该是 10,但我不确定。

trigger sql-server-2012

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

高效获取最后一条记录

我有一个包含 OrderId 的表订单(WarehouseId 和 OrderId 是复合主键)。

WarehouseId | OrderId | ItemId | OrderDate
-------------------------------------------
          1 |       1 |      1 | 2016-08-01
          1 |       2 |      2 | 2016-08-02
          1 |       3 |      5 | 2016-08-10
          2 |       1 |      1 | 2016-08-05
          3 |       1 |      6 | 2016-08-06
Run Code Online (Sandbox Code Playgroud)

(表格已简化,仅显示必填字段)

如何有效地选择特定仓库的最后一个订单?我目前这样做:

SELECT TOP 1 * FROM tblOrder WHERE WarehouseId = 1 ORDER BY OrderId DESC
Run Code Online (Sandbox Code Playgroud)

我担心的是,当我有一个特定仓库的一百万(或更多)订单时,通过排序和选择第一条记录,它会太慢(我认为?)。从我目前得到的建议来看,这不是一项昂贵的操作,因此应该没问题。那正确吗?

或者,有没有更有效的方法来选择最后一个订单记录?

sql-server sql-server-2012 greatest-n-per-group

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

与完整扫描相比,50% 的采样率更新统计数据所需的时间要长得多

我们有一个针对大型表的本地更新统计作业,它基本上发出 UPDATE STATS 命令。从历史上看,我们一直默认使用 FULL SCAN,但最近我们切换到 SAMPLE 50 PERCENT。奇怪的是,update stats 命令的运行时间要高得多。

举个例子,我们有表 1,它有 6 个统计信息(3 个索引,3 个自动生成)。聚集索引为 1.2 TB;NCI 1 为 2.7 GB;NCI 2 为 2.6 GB

1 个月前使用 FULL SCAN 更新了表上的统计信息,该命令耗时 96 分钟。昨晚更新了统计数据,SAMPLE 50 PERCENT,命令耗时 593 分钟!两次运行之间的表行数大致相同。

我可以从 sys.dm_db_stats_properties 看到聚集索引只占用了 4 分钟的时间。我的问题是,为什么将采样率降低 50% 会导致命令运行时间延长近 5 倍?

命令运行时没有发生任何阻塞(根据 SQL Sentry),也没有任何资源瓶颈(CPU < 40%,IO 延迟 < 10 by-in-large)。

我想知道的一件事是并行性是否在起作用 - 使用完整扫描,SQL 可以使用并行性,但使用示例 % 它是单线程的吗?

我们正在运行 SQL 2012 SP2 CU7

sql-server statistics sql-server-2012

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

使用探测残差识别执行计划

我正在尝试找出具有Probe Residual.

需要了解以下内容

  1. 哪个物理和逻辑运算符有这个 Probe Residual
  2. 查询中该运算符的成本百分比是 多少
  3. 相关执行计划
  4. 查询文本

以下是我的一次尝试——但我被困在获取其他细节上。如何获取这些详细信息?

注意:我使用的是 SQL Server 2012

WITH XMLNAMESPACES
(
    DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan'
)
SELECT
    DECP.cacheobjtype,
    DECP.objtype,
    DECP.plan_handle,
    DEQP.objectid,
    DEQP.query_plan,
    DEST.[text]
FROM sys.dm_exec_cached_plans AS DECP
CROSS APPLY sys.dm_exec_query_plan(DECP.plan_handle) AS DEQP
CROSS APPLY sys.dm_exec_sql_text(DECP.plan_handle) AS DEST
WHERE
    1 = DEQP.query_plan.exist(
        '//RelOp[
            @PhysicalOp = "Hash Match"
            ]')
Run Code Online (Sandbox Code Playgroud)

探头残余

在此处输入图片说明

下面引用 Grant Fritkey 和 Rob Farley 的博客/文章

  1. 哈希匹配上的探针残差 - 可怕的 DBA 之家
  2. 当你有一个哈希匹配时探测残差——执行计划中的隐藏成本

xml sql-server execution-plan sql-server-2012 plan-cache

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