标签: sql-server

为什么查询会导致溢出到 tempdb?

背景

我正在将 160gb 数据库从具有 48gb RAM 的 Win 2008 服务器上的 MSSQL 2008(标准)迁移到在具有 64gb RAM 的 Win 2012 上运行 MSSQL 2012(64 位网络版)的新服务器。旧服务器处于活动状态且负载不足;新服务器不在生产中。新服务器有 8 个 tempdb 文件(每个 4GB)。

问题

在新服务器上进行测试时,我看到许多查询中的步骤导致提到“操作员使用 tempdb 在执行期间溢出数据”的警报。我已经能够通过重写一些查询来避免排序,但这并没有真正解决这个问题。旧服务器上的相同查询不会导致溢出。我读过当 MSSQL 无法在内存中完成操作并且必须溢出/分页到 tempdb 时会发生溢出。我应该担心溢出吗?

例子

在此处输入图片说明

我已经在数据库上运行了 sp_updatestats,所以统计信息应该是最新的,但是您会注意到估计的行数和实际的行数之间存在一些差异。

内存问题

我为 64gb 中的 58 个 MSSQL 设置了最大内存设置。目前 MSSQL 已经消耗了大约 35gb 的内存,但工作集只有 682mb。旧服务器(尽管在生产中,处理负载)有 44gb 的内存提交给 MSSQL,其中 43.5gb 在其工作集中。

在此处输入图片说明

我不知道溢出是否与内存设置有关-有人有任何想法吗?MSSQL 目前有大量 RAM 可用,那么为什么它会溢出到 tempdb 以进行某些排序和哈希匹配?

sql-server sql-server-2012

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

如何查看加密视图或存储过程

我正在开发第三方数据库。

当我尝试通过右键单击查看视图的定义时,CREATE TO然后单击 ,NEW QUERY EDIT WINDOW出现错误:

此对象可能不存在此属性,或者可能由于访问权限不足而无法检索。文本已加密。

sql-server-2008 sql-server sql-server-2012

27
推荐指数
5
解决办法
10万
查看次数

何时使用 CDC 跟踪历史?

SQL Server Change Data Capture 是一项从 SQL Server 事务日志中读取历史数据并将其存储在特殊表中的功能。

通过使用特殊的表值函数 (TVF),它允许用户查询这些数据,从而可以获取特定表上的所有更改或仅获取特定时间内更改导致的净更改。

CDC具有一定的优势

  • 它可以配置为仅跟踪某些表或列。
  • 它能够在一定程度上处理模型更改。
  • 它不会像触发器那样严重影响性能,因为它与事务日志一起工作。
  • 它很容易启用/禁用,并且不需要表上应跟踪的其他列。

它也有一些缺点:

我已经阅读了很多关于 CDC 的文章,虽然我现在知道如何使用它,但我仍然不确定它是否适合我。

  1. CDC 适合哪些任务/场景?(例如,允许用户将数据对象恢复到某个时间点?审计?显示数据的完整历史记录?)
  2. 何时不应使用 CDC,而应求助于基于触发器的自定义解决方案?
  3. 在操作数据库中使用 CDC 并在操作应用程序中使用 CDC 数据是否可以?(例如,将其展示给最终用户)或者这显然是对该功能的滥用?

我经常听说 CDC 是一个审计工具,但这不是SQL Server 审计的用途吗?它们是用于同一任务的不同工具吗?或者CDC可以用于其他用途吗?

我目前的情况是,我被要求构建一个可靠的数据框架,该框架应该是未来多个应用程序的基础。确切的要求是模糊的,但其中之一是它应该能够跟踪数据历史并将旧条目与其他表中的所有相关数据一起恢复。我现在正在评估 CDC 作为一种选择,但不确定这是否是可行的方法,因为我真的找不到任何推荐的用例。

虽然我很欣赏针对我的特定场景的建议,但答案应该提供有关何时或何时不使用 Change Data Capture 的一般建议。

sql-server change-data-capture data-versioning

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

从一个存储过程启动3个存储过程时如何回滚

我有一个存储过程,它只在其中执行 3 个存储过程。如果主 SP 成功,我只使用 1 个参数来存储。

如果第一个存储过程在主存储过程中工作正常,但第二个存储过程失败,那么它会自动回滚主 SP 中的所有 SP 还是我必须发出一些命令?

这是我的程序:

CREATE PROCEDURE [dbo].[spSavesomename] 
    -- Add the parameters for the stored procedure here

    @successful bit = null output
AS
BEGIN
begin transaction createSavebillinginvoice
    begin Try
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

   BEGIN 

   EXEC [dbo].[spNewBilling1]

   END

   BEGIN 

   EXEC [dbo].[spNewBilling2]

   END

   BEGIN 

   EXEC [dbo].[spNewBilling3]

   END 

   set @successful  = 1

   end Try

    begin Catch
        rollback transaction createSavesomename
        insert …
Run Code Online (Sandbox Code Playgroud)

sql-server stored-procedures transaction

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

在 SQL Server 中,当对只有聚集索引的表强制执行索引查找时,我能否保证没有显式 ORDER BY 子句的顺序?

更新 2014-12-18

由于对主要问题的压倒性回答是“否”,更有趣的回答集中在第 2 部分,如何使用明确的ORDER BY. 尽管我已经标记了一个答案,但如果有性能更好的解决方案,我也不会感到惊讶。

原来的

出现这个问题是因为我能找到的针对特定问题的唯一极快的解决方案只能在没有ORDER BY子句的情况下起作用。下面是产生问题所需的完整 T-SQL,以及我提出的解决方案(我使用的是 SQL Server 2008 R2,如果这很重要。)

--Create Orders table
IF OBJECT_ID('tempdb..#Orders') IS NOT NULL DROP TABLE #Orders
CREATE TABLE #Orders
(  
       OrderID    INT NOT NULL IDENTITY(1,1)
     , CustID     INT NOT NULL
     , StoreID    INT NOT NULL       
     , Amount     FLOAT NOT NULL
)
CREATE CLUSTERED INDEX IX ON #Orders (StoreID, Amount DESC, CustID)

--Add 1 million rows w/ 100K Customers each of whom had 10 orders
;WITH  
    Cte0 …
Run Code Online (Sandbox Code Playgroud)

sql-server

27
推荐指数
2
解决办法
6685
查看次数

在 SQL Server 中执行 FIZZBUZZ 测试的最有效方法是什么?

是否有更有效的方法来获得从 1 到 49 的数字列表,其中一列包含单词,FIZZ当数字可以被 3 整除BUZZ时,当数字可以被 5 整除FIZZBUZZ时,当数字可以被均分时由两个3和5?

我的尝试是(注意,这会清空您的过程缓存,所以不要在生产箱上运行):

DBCC FREEPROCCACHE
GO
/*VARIANT1*/
;WITH t AS (
    SELECT RowNum = ROW_NUMBER() OVER (ORDER BY o.object_id)
    FROM sys.objects o
)
SELECT t.RowNum
    , CASE WHEN ((t.RowNum % 3) + (t.RowNum % 5)) = 0  THEN 'FIZZBUZZ' 
    ELSE 
        CASE WHEN t.RowNum % 3 = 0 THEN 'FIZZ' 
        ELSE 
            CASE WHEN t.RowNum % 5 = 0 THEN 'BUZZ' 
            ELSE '' 
            END 
        END 
    END
FROM …
Run Code Online (Sandbox Code Playgroud)

sql-server

27
推荐指数
7
解决办法
2726
查看次数

SET STATISTICS IO-工作表/工作文件

我正在执行查询,生成计划: 在此处输入图片说明

统计IO:

Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Workfile'. Scan count 128, logical reads 5952, physical reads 576, read-ahead reads 6080, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table1'. Scan count 9, logical reads 90450, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan sql-server-2012

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

重建索引时何时使用 sort_in_tempdb?

我们正在讨论是否对 DW 表使用 SORT_IN_TEMPDB 选项。我的理解是,使用此选项时会有更多的写入,尽管它们更具顺序性。我们有一个 SAN(它有时非常慢),所以在我们的例子中,我们希望尽可能地限制写入次数。我相信 tempdb 位于单独的 LUN(磁盘集)上。

我们的数据文件和 tempdb 文件中有足够的磁盘空间。在这种情况下,我们会从使用 SORT_IN_TEMPDB 中受益吗?

让我印象深刻的一件事是对这个答案的评论

重建索引时,您需要两倍于索引的空间 + 20% 用于排序。因此,一般而言,要重建数据库中的每个索引,您只需要数据库中最大索引的 120%。如果你使用 SORT_IN_TEMPDB,你只赢了 20%,你的数据文件中仍然需要额外的 100%。此外,在 tempdb 中使用 sort 会大大增加您的 IO 负载,因为不是将索引一次写入数据文件,而是现在将其写入一次 tempdb,然后将其写入数据文件。所以这并不总是理想的。

我们绝对不想通过慢速/可能配置错误的 SAN 增加 IO 负载。

测试这个的最佳方法是什么?通过简单地重建带有和不带有选项的表并记录时间?

编辑:我们有 8 个 tempdb 文件,每个 15GB。我们确实设置了 TF 1117/1118 标志并启用了 IFI。我们目前混合使用 sort_in_tempdb 选项和不使用它进行重建。

谢谢!

SQL Server 2012 企业版

index sql-server sql-server-2012

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

为什么 :r SQLCMD 命令在部署后脚本中标记为错误?

我已经使用过几次部署后脚本,并且总是直观地使用构建操作“PostDeploy”,因为它就是这样。现在我第一次尝试按照脚本模板中的内置指令使用":r somescript.sql"语法。

此行立即被标记为错误:

“':' 旁边的 SQL80001 语法错误”

我找到了将 PDS 设置为“无”的建议。这没有帮助,错误仍然存​​在。我在这里缺少什么?

sql-server deployment ssdt visual-studio-2013

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

将(数百个)表从一台服务器复制到另一台服务器(使用 SSMS)

我有数百个(目前为 466 个,但在不断增加)表,我必须从一台服务器复制到另一台服务器。

我以前从未这样做过,所以我完全不确定如何处理它。所有表的格式相同:Cart<Eight character customer number>

这是一个更大项目的一部分,我正在将所有这些Cart<Number>表合并到一个Carts表中,但这完全是一个完全不同的问题。

有没有人有我可以用来复制所有这些表的最佳实践方法?如果有帮助,两台服务器上的数据库名称相同。正如我之前所说,我有这个sa帐户,所以我可以做任何必要的事情来将数据从 A 获取到 B。两台服务器也位于同一个服务器群中。

sql-server ssms linked-server sql-server-2012

27
推荐指数
4
解决办法
7950
查看次数