标签: sql-server

使用函数调用的估计与实际查询计划

我在 SQL 服务器上有这个查询,一个合并复制查询:

SELECT DISTINCT
    b.tablenick,
    b.rowguid,
    c.generation,
    sys.fn_MSgeneration_downloadonly
    (
        c.generation,
        c.tablenick
    )
FROM #belong b
LEFT OUTER JOIN dbo.MSmerge_contents c ON 
    c.tablenick = b.tablenick
    AND c.rowguid = b.rowguid;
Run Code Online (Sandbox Code Playgroud)

估计的查询计划包括 3 个查询的信息:

  1. 上面的查询
  2. 对 fn_MSgeneration_downloadonly 的函数调用
  3. fn_MSArticle_has_downloadonly_property 的函数调用

实际的查询计划仅包括以下信息:

  1. 上面的查询

没有关于功能。为什么实际方案中缺少功能信息?

我尝试了这些选项:

SET STATISTICS PROFILE ON
SET STATISTICS XML ON
Run Code Online (Sandbox Code Playgroud)

它创建了一个实际计划,但它缺少第 2 部分和第 3 部分,这与我在 Management Studio 中使用实际查询计划选项时相同。

例如,如果我要使用 Profiler 来捕获有关函数调用的信息,我会选择哪些事件?


没有找到与查询计划特别相关的答案,但我分析了 SP:StmtStarting 和 SP:StmtCompleted 并显示了函数调用。

sql-server execution-plan functions merge-replication

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

为什么 io_stall_writes_ms 对于 tempdb 如此之高?

我们在同一个磁盘驱动器上有用户和系统数据文件。( io_stall_write_ms / ( 1.0 + num_of_writes ) ) 对于用户文件低于 2,但 tempdb 文件通常超过 400。我在几台服务器上看到了这一点,我很好奇是否存在写入 tempdb 需要更长时间的原因比一个普通的数据库数据文件。

SELECT DISTINCT UPPER(LEFT(mf.physical_name, 1)) AS Directory,
( io_stall_write_ms / ( 1.0 + num_of_writes ) ) as result, 
io_stall_write_ms, num_of_writes, 
fs.database_id, 
fs.[file_id]
FROM sys.dm_io_virtual_file_stats(NULL, NULL) AS fs
INNER JOIN sys.master_files AS mf ON fs.database_id = mf.database_id
AND fs.[file_id] = mf.[file_id]
Run Code Online (Sandbox Code Playgroud)

谢谢,

sql-server-2008 sql-server

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

是否可以使用 SQL Server 评估版开发 SSIS

我们正在考虑购买一个SQL Standard Server用于实现ETL via SSIS. 由于它对我们来说非常昂贵,我想在免费版本上测试开发 SSIS 包。由于 express 版本没有集成 SSIS 我想在 SQL Server 2014的Evaluation 180 Expires Version上尝试一下,但找不到任何关于

- Is it possible
- Are there limitations.
Run Code Online (Sandbox Code Playgroud)

有人可以在这里帮助我吗?

sql-server ssis

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

如何回答为什么突然需要更改索引或查询

我是初级 DBA,有 3 年的经验。我们的工作是微调查询或建议开发人员应该重写特定代码或需要索引。

开发团队经常问的一个简单问题是:“昨天运行良好,突然发生了什么变化?” 我们将被要求检查基础设施方面。对任何问题的第一反应似乎总是将最大的责任归咎于基础设施,这始终是首先要验证的事情。

我们应该如何回答开发团队提出的“改变了什么”的问题?大家有遇到过同样的情况吗?如果是这样,请分享您的经验。

performance sql-server execution-plan

11
推荐指数
3
解决办法
879
查看次数

使用 ORDER BY 从不同表中选择 TOP 1 时如何设置索引视图

我正在努力在以下场景中设置索引视图,以便在没有两个聚集索引扫描的情况下执行以下查询。每当我为此查询创建索引视图然后使用它时,它似乎忽略了我放在它上面的任何索引:

    -- +++ THE QUERY THAT I WANT TO IMPROVE PERFORMANCE-WISE +++

    SELECT TOP 1 *
    FROM    dbo.TB_test1 t1
            INNER JOIN dbo.TB_test2 t2 ON t1.PK_ID1 = t2.FK_ID1
    ORDER BY t1.somethingelse1
           ,t2.somethingelse2;


    GO
Run Code Online (Sandbox Code Playgroud)

表设置如下:

  • 两张桌子
  • 它们通过上面的查询通过内部连接连接起来
  • 并通过上面的查询从第一个表中的一列和第二个表中的一列排序;仅选择 TOP 1
  • (在下面的脚本中也有一些行来生成测试数据,以防万一它有助于重现问题)

    -- +++ TABLE SETUP +++
    
    CREATE TABLE [dbo].[TB_test1]
        (
         [PK_ID1] [INT] IDENTITY(1, 1)  NOT NULL
        ,[something1] VARCHAR(40) NOT NULL
        ,[somethingelse1] BIGINT NOT NULL
            CONSTRAINT [PK_TB_test1] PRIMARY KEY CLUSTERED ( [PK_ID1] ASC )
        );
    
    GO
    
    create TABLE [dbo].[TB_test2]
        (
         [PK_ID2] [INT] IDENTITY(1, …
    Run Code Online (Sandbox Code Playgroud)

index sql-server-2008 sql-server materialized-view index-tuning

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

无法镜像数据库 SQL Server 2012

尝试使用以下命令镜像数据库时

ALTER AVAILABILITY GROUP SQLAlwaysonGroup ADD DATABASE test0916aj8CJ
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

消息 1475,级别 16,状态 105,第 1 行
数据库“test0916aj8CJ”可能包含尚未备份的批量记录更改。在主体数据库或主数据库上进行日志备份。然后在镜像数据库上还原此备份以启用数据库镜像,或在每个辅助数据库上还原此备份以使其能够加入可用性组。

这可以在不支持数据库的情况下完成吗?或者我应该备份然后丢弃备份。它用于新创建的数据库,因此此时我不需要备份。

我尝试了以下...

BACKUP
DATABASE [test0916aj8CJ] TO DISK = N’NUL’
WITH COPY_ONLY, NOFORMAT, INIT,
NAME = N’test-Full Database Backup’,
SKIP, NOREWIND, NOUNLOAD
GO
Run Code Online (Sandbox Code Playgroud)

但上述方法也不起作用。

谢谢

sql-server t-sql alter-database

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

在非常繁忙的表上创建索引

我们有一张桌子,insert\select每次都有很多(比如每秒有 100 台机器插入\更新)。

在不能被锁定的表上创建索引的最佳方法是什么?

如果我创建索引,我确定它会锁定请求,而我做不到。

这是一个有 100 万行+的大表。

index sql-server sql-server-2008-r2

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

用 XQuery 替换 SQL Server 中强类型 xml 元素的值

给定一个在 XML 模式集合中定义的元素,如下所示:

<xsd:element name="xid">
    <xsd:simpleType>
        <xsd:restriction base="xsd:string">
            <xsd:maxLength value="32" />
        </xsd:restriction>
    </xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

您将如何使用 XQuery 更新元素?

该元素位于架构集合的ns命名空间中。我一直在尝试更新以下查询的元素:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793" cast as element(ns{http://www.anon.com}:xid,#anonymous) ?') 
 where id = 11793
Run Code Online (Sandbox Code Playgroud)

但这会产生以下错误:

消息 9301,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:在此版本的服务器中,“cast as”不可用。请使用“演员为?” 句法。

如果我完全删除演员表并使用此查询:

update cm.item
   set data.modify(
    'declare namespace ns="http://www.anon.com"; 
     replace value of (/ns:*/ns:xid)[1] with "X00011793"') 
 where id = 11793
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

消息 2247,级别 16,状态 1,第 2 行 XQuery [cm.item.data.modify()]:该值的类型为“xs:string”,它不是预期类型“<anonymous>”的子类型。

如果我发出这个查询: …

xml sql-server sql-server-2008-r2 xquery

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

SQL Server 中的“截断登录检查点”选项

说来话长,但我们的长期顾问(前雇员)在几年前(2006 年左右)编写了一个自定义脚本来与 Tivoli Storage Manager 交互,它似乎正在检查名为truncate log on checkpoint. 他们声称它阻止脚本在 SQL 2012 实例上运行和执行备份。

我觉得这完全是废话,因为我找不到任何这样的选项,sp_configure而且备份在任何地方都可以工作,只有一个实例。但是,我想移除地雷,如果是这样的话,并移除其他过时的元素。我确实让他们与供应商核实,但我对他们所说的任何事情都没有高度的信心。

我所做的研究几乎没有得到更多的回报,它可能是 SQL 2000 或 Sybase 选项的一个选项。另一种说法是,当恢复模型是SIMPLE并且没有显式选项打开或关闭它时,它在更高版本(2008 及更高版本)上被隐式调用/使用。

由于TRUNCATE LOG如今事务日志的工作方式,该命令已过时,因此我认为此时甚至无法查询该选项。

由于我没有任何 SQL Server 2000 实例,我希望有人能回忆起这个,或者可以在他们周围的一个实例上检查它。我已经告诉他们,我没有什么可以推荐的。我也希望有人可以确认这已经过时了。

sql-server transaction sql-server-2012 checkpoint log

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

基数估计不佳会使 INSERT 不符合最少日志记录吗?

为什么第二个INSERT语句比第一个语句慢 5 倍?

从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,数据加载性能指南中的文档指出两个插入都应该能够被最低限度地记录。因此,如果最小日志记录是关键性能差异,为什么第二个查询不符合最小日志记录?可以做些什么来改善这种情况?


查询 #1:使用 INSERT...WITH (TABLOCK) 插入 5MM 行

考虑以下查询,该查询将 5MM 行插入到堆中。此查询在 中执行1 second并生成64MB由 报告的事务日志数据sys.dm_tran_database_transactions

CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL)
GO
INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n)
SELECT n
-- Any table/view/sub-query that correctly estimates that it will generate 5MM rows
FROM dbo.fiveMillionNumbers
-- Provides greater consistency on my laptop, where other processes are running
OPTION (MAXDOP 1)
GO
Run Code Online (Sandbox Code Playgroud)


查询 #2:插入相同的数据,但 SQL 低估了行数

现在考虑这个非常相似的查询,它对完全相同的数据进行操作,但碰巧从SELECT基数估计太低的表(或在我的实际生产案例中具有许多连接的复杂语句)中提取。此查询在事务日志数据中执行 …

performance sql-server insert transaction-log sql-server-2014

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