小编Mar*_*ith的帖子

高效插入带有聚集索引的表

我有一个 SQL 语句,该语句将行插入到表中,并且在 TRACKING_NUMBER 列上具有聚集索引。

例如:

INSERT INTO TABL_NAME (TRACKING_NUMBER, COLB, COLC) 
SELECT TRACKING_NUMBER, COL_B, COL_C 
FROM STAGING_TABLE
Run Code Online (Sandbox Code Playgroud)

我的问题是 - 在聚集索引列的 SELECT 语句中使用 ORDER BY 子句是否有帮助,或者是否会因 ORDER BY 子句所需的额外排序而否定任何获得的收益?

performance sql-server clustered-index insert

31
推荐指数
3
解决办法
7万
查看次数

并行计划中的“实际”行数不准确

这是一个纯粹的学术问题,以至于它不会引起问题,我只是想听听对这种行为的任何解释。

以标准问题 Itzik Ben-Gan 交叉连接 CTE 计数表为例:

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION [dbo].[TallyTable] 
(   
    @N INT
)
RETURNS TABLE WITH SCHEMABINDING AS
RETURN 
(
    WITH 
    E1(N) AS 
    (
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
        SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
    )                                       -- 1*10^1 or 10 rows …
Run Code Online (Sandbox Code Playgroud)

sql-server

17
推荐指数
3
解决办法
1465
查看次数

你如何按参数排序?

只是想知道我是否可以就我正在运行的存储过程征求一些反馈,以及是否有更有效的方法来处理这种情况(我很确定会有!)。

基本上,我有一个 SP,我调用它来返回可能具有一个或多个状态和排序顺序的记录(作业)列表(我使用 RowNum 进行分页)。目前我正在使用 WITH RECOMPILE,因为状态的变化可能一直在变化(取决于用户等)。还有一些过滤正在进行。

我正在使用 IF 语句来运行相同的代码,唯一的变化是排序顺序。

我想我的问题是:有没有更好的方法来做到这一点(对于不同的状态可能有不同的 SP)?由于缺乏知识,我是否使事情变得过于复杂(很可能) SP 实际上还可以,但需要进行细微调整以减少行数?

我在下面粘贴了 SP 的一部分 - 与完整代码的唯一区别是不同排序顺序的附加 IF 语句......

我很感激任何反馈。

提前致谢!

PROCEDURE [dbo].[sp_Jobs] 

@PageNumber int, 
@PageSize int, 
@FilterExpression varchar(500), 
@OrderBy varchar(50), 
@CustomerID int, 
@ShowNotSet bit, 
@ShowPlaced bit, 
@ShowProofed bit, 
@ShowReProofed bit, 
@ShowApproved bit, 
@ShowOnTime bit, 
@ShowLate bit, 
@ShowProblem bit, 
@ShowCompleted bit, 
@ShowDispatched bit, 
@ShowUnapproved bit, 
@ShowClosed bit, 
@ShowReturned bit, 
@UserID int

WITH RECOMPILE 

AS

--JobNumber DESC 
if @OrderBy='JobNumberDESC' 
BEGIN 

WITH Keys AS (SELECT TOP (@PageNumber * @PageSize) ROW_NUMBER() …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 stored-procedures

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

DBCC CheckDB 会错过哪些类型的损坏?

这个问题是由这篇较早的帖子提示的,我有一个数据库归档以备将来调查,该数据库在以下情况下恢复:

BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file ’BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.
Run Code Online (Sandbox Code Playgroud)

在链接的问题和备份中,我已准备好进行 DBCC PAGE 调查,DBCC CHECKDB 无错误通过,但显然存在损坏。

哪些类型的损坏会导致 CHECKDB 通过但 BACKUP WITH CHECKSUM 会失败?

sql-server-2005 sql-server-2008 dbcc corruption

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

从开始索引还是在出现性能问题时?

我的问题是关于索引的使用。

  1. 我应该从一开始还是在出现性能问题时开始索引?

  2. 我们还可以在执行查询时创建临时索引。这种技术的优缺点是什么?

performance index database-agnostic

15
推荐指数
2
解决办法
542
查看次数

优化 BLOB 数据的 BCP 性能

我正在计划将 2TB 数据库实时迁移到分区表的过程。从广义上讲,该系统是一个文档存储,大部分空间分配给 50kb 到 500kb 之间的 LOB,一小部分在 500kb 到 1MB 范围内。部分迁移将涉及从旧数据库到新数据库的 BCPing 数据。

BCP 是首选方法,因为数据中的当前/历史鸿沟允许在最终切换之前分阶段(在较安静的时期)提取较旧的数据,从而最大限度地减少对实时系统的影响。数据量和存储可用性排除了对分区方案的原位重建

由于 BLOB 内容,我怀疑通过尝试使用 KILOBYTES_PER_BATCH 而不是 ROWS_PER_BATCH 可能会获得一些性能提升。BCP文档中建议SQL可以根据这个值优化操作。

我找不到关于这些优化的性质或从哪里开始测试的任何指导。在没有建议的情况下,我将尝试在 4/8/16/32/64mb 边界处进行短期运行。

可能会从更改数据包大小(BCP -a 参数,而不是服务器级别设置)中获得一些收益,但我倾向于将其提高到最大 65535,除非有人有更公式化的方法。

performance sql-server bcp

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

DELETE 语句与 REFERENCE 约束冲突

我正在尝试删除所有用户,但出现错误:

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_M02ArticlePersons_M06Persons". The conflict occurred in database "workdemo.no", table "dbo.M02ArticlePersons", column 'M06PersonId'.
The statement has been terminated.
Run Code Online (Sandbox Code Playgroud)

查询:

DELETE FROM [workdemo.no].[dbo].[M06Persons] 
WHERE ID > '13'
GO
Run Code Online (Sandbox Code Playgroud)

似乎我需要使用,on delete cascade;但我被卡住了。

sql-server t-sql

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

使用 SQL Server 2012 OLAP 多维数据集支持网站是否合理?

我的任务是为一家大型零售连锁店设计一个解决方案。他们希望允许其 120 万客户中的每一个都登录到一个网站,查看大约 50 个类别的最近购买(当月、上月、年初至今)的分布情况。数据将每天更新一次。

我正在考虑建立一个基于 SQL Server 2012 的 OLAP 多维数据集,并让网站直接查询这个多维数据集,利用主动缓存等功能。但是,作为一名开发人员,我几乎没有使用 SQL Server 的分析服务部分的经验,因此我非常关心此解决方案的性能。

将网站直接连接到 OLAP 多维数据集听起来像一个可行的解决方案吗?这些系统是否像 SQL Server 一样对来自多个用户的负载做出反应,使其成为一个合理的解决方案,或者它们的行为是否完全不同?

我不希望用户经常检查他们的状态,我当然会在网络服务器等上使用缓存。

sql-server ssas web-server olap

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

在没有事务日志的情况下备份数据库

当我备份数据库时,有没有办法排除该备份中的事务日志?或者我在想这个错误并恢复原始数据库需要事务日志的内容?

我无法缩小事务日志,因为数据库正在使用复制,我将不得不中断复制。

如果我发出此命令然后恢复数据库,它会返回一个 50 GB 的日志文件:

BACKUP DATABASE DatabaseName TO DISK = 'c:\temp\Database.bak'
Run Code Online (Sandbox Code Playgroud)

我必须将恢复的数据库更改为简单,然后在释放 50GB 之前缩小日志文件。我无法将原始数据库更改为 simple,因为它是复制副本。

sql-server-2008

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

事务隔离级别快照与截断?

我希望有人可以对我没有预料到的关于 SNAPSHOT 隔离与 TRUNCATE 的这种行为有所了解。

数据库:允许快照隔离 = True;已读已提交快照 = False。

过程 1(用大量连接替换长期运行的复杂 SELECT 表 foo 的内容):

BEGIN TRAN; 
TRUNCATE TABLE foo; 
INSERT INTO foo SELECT...; 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

程序 2(从表 foo 中读取):

SET TRANSACTION ISOLATION LEVEL SNAPSHOT; 
SELECT * FROM foo;
Run Code Online (Sandbox Code Playgroud)

如果在执行程序 2 时程序 1 正在运行,程序 2 将通过 LCK_M_SCH_S 等待(根据 sp_WhoIsActive)暂停,直到程序 1 完成。当 Procedure2 完成时,它会引发此异常:

数据库“DatabaseName”中的快照隔离事务失败,因为自该事务开始以来,该语句访问的对象已被另一个并发事务中的 DDL 语句修改。这是不允许的,因为元数据没有版本化。如果与快照隔离混合使用,对元数据的并发更新可能会导致不一致。

但是,Microsoft 并未将 TRUNCATE 列为 SNAPSHOT 隔离下不允许的 DDL 语句:http : //msdn.microsoft.com/en-us/library/bb933783.aspx

显然,我没有正确理解某些东西,因为我本来期望 Procedure2 的最佳情况是在 TRUNCATE 之前立即从表中返回最近提交的数据,或者是被 Procedure1 阻止然后返回新内容的最坏情况桌子。你能帮我吗?

sql-server sql-server-2008-r2 truncate snapshot-isolation

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