我有一个 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 子句所需的额外排序而否定任何获得的收益?
这是一个纯粹的学术问题,以至于它不会引起问题,我只是想听听对这种行为的任何解释。
以标准问题 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) 只是想知道我是否可以就我正在运行的存储过程征求一些反馈,以及是否有更有效的方法来处理这种情况(我很确定会有!)。
基本上,我有一个 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) 这个问题是由这篇较早的帖子提示的,我有一个数据库归档以备将来调查,该数据库在以下情况下恢复:
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 会失败?
我的问题是关于索引的使用。
我应该从一开始还是在出现性能问题时开始索引?
我们还可以在执行查询时创建临时索引。这种技术的优缺点是什么?
我正在计划将 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,除非有人有更公式化的方法。
我正在尝试删除所有用户,但出现错误:
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;但我被卡住了。
我的任务是为一家大型零售连锁店设计一个解决方案。他们希望允许其 120 万客户中的每一个都登录到一个网站,查看大约 50 个类别的最近购买(当月、上月、年初至今)的分布情况。数据将每天更新一次。
我正在考虑建立一个基于 SQL Server 2012 的 OLAP 多维数据集,并让网站直接查询这个多维数据集,利用主动缓存等功能。但是,作为一名开发人员,我几乎没有使用 SQL Server 的分析服务部分的经验,因此我非常关心此解决方案的性能。
将网站直接连接到 OLAP 多维数据集听起来像一个可行的解决方案吗?这些系统是否像 SQL Server 一样对来自多个用户的负载做出反应,使其成为一个合理的解决方案,或者它们的行为是否完全不同?
我不希望用户经常检查他们的状态,我当然会在网络服务器等上使用缓存。
当我备份数据库时,有没有办法排除该备份中的事务日志?或者我在想这个错误并恢复原始数据库需要事务日志的内容?
我无法缩小事务日志,因为数据库正在使用复制,我将不得不中断复制。
如果我发出此命令然后恢复数据库,它会返回一个 50 GB 的日志文件:
BACKUP DATABASE DatabaseName TO DISK = 'c:\temp\Database.bak'
Run Code Online (Sandbox Code Playgroud)
我必须将恢复的数据库更改为简单,然后在释放 50GB 之前缩小日志文件。我无法将原始数据库更改为 simple,因为它是复制副本。
我希望有人可以对我没有预料到的关于 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 ×6
performance ×3
bcp ×1
corruption ×1
dbcc ×1
index ×1
insert ×1
olap ×1
ssas ×1
t-sql ×1
truncate ×1
web-server ×1