我真的很少使用触发器。所以我第一次遇到了一个问题。我有很多带有触发器的表(每个表有 2 个或更多)。我想知道并更改每个表的触发顺序。是否有可能获得这些信息?
添加:
这是我发现的关于 mssqltips 的一篇很好的文章。
为什么这个查询会导致死锁?
UPDATE TOP(1) system_Queue SET
[StatusID] = 2,
@ID = InternalID
WHERE InternalID IN (
SELECT TOP 1
InternalID FROM system_Queue
WHERE IsOutGoing = @IsOutGoing AND StatusID = 1
ORDER BY MessageID ASC, InternalID ASC)
Run Code Online (Sandbox Code Playgroud)
添加死锁图:
<keylock hobtid="72057594236436480" dbid="9" objectname="Z.dbo.system_Queue" indexname="PK_system_Queue" id="lock5b25cc80" mode="X" associatedObjectId="72057594236436480">
<owner-list>
<owner id="processc6fe40" mode="X"/>
</owner-list>
<waiter-list>
<waiter id="processc7b8e8" mode="S" requestType="wait"/>
</waiter-list>
</keylock>
<keylock hobtid="72057594405453824" dbid="9" objectname="Z.dbo.system_Queue" indexname="IX_system_Queue_DirectionByStatus" id="lock48cf3180" mode="S" associatedObjectId="72057594405453824">
<owner-list>
<owner id="processc7b8e8" mode="S"/>
</owner-list>
<waiter-list>
<waiter id="processc6fe40" mode="X" requestType="wait"/>
</waiter-list>
</keylock>
Run Code Online (Sandbox Code Playgroud)
添加:
感谢Sankar的文章,其中提供了如何避免此类死锁的解决方案: …
我必须使用索引视图来达到性能。正如我从这个比较表中看到的,标准版不支持索引视图。但是 BOL 说:
可以在任何版本的 SQL Server 中创建索引视图。在 SQL Server Enterprise 中,查询优化器会自动考虑索引视图。要在所有其他版本中使用索引视图,必须使用 NOEXPAND 表提示。
那么它会起作用吗(我说的是性能)
select * from dbo.OrderTotals with (noexpand, index=IXCU_OrderTotals)
Run Code Online (Sandbox Code Playgroud)
在 SQL Server 标准版上以及它的工作原理
select * from dbo.OrderTotals
Run Code Online (Sandbox Code Playgroud)
在企业版上?
这是查看代码:
CREATE VIEW dbo.OrderTotals
WITH SCHEMABINDING
AS
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price * r.Quantity)
, XCount = COUNT_BIG(*)
from dbo.Order r
group by r.OrderId
CREATE UNIQUE CLUSTERED INDEX IXCU_OrderTotals ON OrderTotals (OrderId)
Run Code Online (Sandbox Code Playgroud) 我有两个表:详细信息和这些详细信息的总计。
详细信息(缓慢的解决方案):
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price * r.Quantity)
from dbo.Order r
group by r.OrderId
Run Code Online (Sandbox Code Playgroud)
总计(快速解决方案):
select
t.OrderId
, t.TotalQty
, t.TotalGrossConsid
, t.IsValid
from dbo.OrderTotal t
Run Code Online (Sandbox Code Playgroud)
有时总数变得无效(某些作业必须重新计算更改的总数,但会延迟)。如您所知,第二个查询更快,有效总数的数量多于无效总数。因此,我正在寻找一个组合查询,该查询从第二个表 (totals) 返回有效总数,并使用第一个慢查询返回动态重新计算的总数。所以我的目标将实现:所有总数都是有效的,响应时间比完全重新计算要快。
这是我的尝试(混合解决方案):
with fast_static(OrderId, TotalQty, TotalGrossConsid, IsValid)
as
(
select
t.OrderId
, t.TotalQty
, t.TotalGrossConsid
, t.IsValid
from dbo.OrderTotal t
)
, slow_dynamic(OrderId, TotalQty, TotalGrossConsid)
(
select
OrderId = r.OrderId
, TotalQty = SUM(r.Quantity)
, TotalGrossConsid = SUM(r.Price …Run Code Online (Sandbox Code Playgroud) performance sql-server-2008 query aggregate materialized-view
我正在从 C# 代码创建一个动态数据库,并希望数据库具有固定大小(例如 5 GB)。通过代码创建数据库时,我需要指定 MDF 和 LDF 最大文件大小。理想值应该是多少?每个 2.5GB 还是它们的其他比例?
我必须确保总数据库大小不超过 5GB,所以我应该只担心 MDF 大小(将其固定在 5GB)并让 LDF 大小无限增长(我不能这样做,但如果它受到伤害性能那么我必须考虑一下)?
谢谢,维维克
我有两个函数:fn_Without_Param和fn_With_Param
CREATE FUNCTION [dbo].[fn_Without_Param]
(
)
...
INNER JOIN .. ON .. AND SubmitDate = CONVERT( varchar(10), GETUTCDATE(), 101 )
Run Code Online (Sandbox Code Playgroud)
和
/*
I am requesting it so:
declare @SubmitDate datetime
set @SubmitDate = CONVERT( varchar(10), GETUTCDATE(), 101 )
select * from [dbo].[fn_With_Param] (@SubmitDate)
*/
CREATE FUNCTION [dbo].[fn_With_Param]
(
@SubmitDate datetime
)
...
INNER JOIN .. ON .. AND SubmitDate = @SubmitDate
Run Code Online (Sandbox Code Playgroud)
在第一种情况下,我有不确定性 (?) 函数(因为 GETUTCDATE)并且我用相同的输入参数调用了第二个函数(CONVERT(varchar(10), GETUTCDATE(), 101 ) - 今天没有小时,分钟,秒,毫秒)。我的函数是不确定的吗?如何检测这一点,也许 sql server 有一些公共标记。为什么第二个函数更慢?
每个管理员、开发人员都有自己的脚本集合(一些模式)。他们有时会被解雇一份工作,而他们又受雇于另一份工作。有没有好的、好用的、有索引的工具来收集常用的sql脚本(默认结构化文件夹/文件系统)?
我有一个表变量:
DECLARE @to_process TABLE
(
[Id] [bigint] NOT NULL,
[SequenceId] [bigint] NOT NULL,
...
)
INSERT INTO @to_process
( Id
, SequenceId
...
)
SELECT
TOP (@recordsToProcess)
Id
, SequenceId
...
Run Code Online (Sandbox Code Playgroud)
在我的存储过程中。我调查过插入到其中花费了大约 66% 的总执行时间。

如何改进或优化我的代码以加速我的 sp 执行?
添加:

我有这样的表:

因此语言表中的数据:

因此文本表中的数据:

我必须返回请求语言的文本(如果存在)和默认语言的文本(如果它不存在)。是否可以在一个查询中做到这一点(不while,拜托)?
代码:
DECLARE @CommentId bigint = 1
--DECLARE @LanguageCode nvarchar(2) = 'en' -- "english text" returns
DECLARE @LanguageCode nvarchar(2) = 'ua' -- nothing at this moment
SELECT
t.CommentId
,t.TextId
,t.[Text]
,t.LanguageId
,RequestedLanguageId = @LanguageCode
FROM dbo.common_Text t
INNER JOIN dbo.common_LanguageType l
ON t.LanguageId = l.LanguageId
WHERE l.Code = @LanguageCode
AND t.CommentId = @CommentId
Run Code Online (Sandbox Code Playgroud)
谢谢你。
添加:
如果代码请求“ua”(乌克兰语)文本,而这不是该语言的任何文本,那么它将搜索俄语文本。如果找到 - 好的,如果没有,它将寻找英文文本。语言列表可能会有所不同。
我读过一篇文档(设计高度可扩展的 OLTP 系统),其中描述了如何获得更高性能的技巧:
由于行很小(很多适合一页),多个锁可能会争用一个 PAGELATCH。我们可以“浪费”一点空间来获得更多性能。解决方案:用 CHAR 列填充行以使每一行占据整页。
有没有人使用这种方法?你得到了什么结果?
谢谢你。
添加:
警告。链接的文章不是行动指南。Thomas Kejser描述了对 TB 级数据库的测试,仅此而已。
performance ×5
sql-server ×3
query ×2
aggregate ×1
cte ×1
deadlock ×1
determinism ×1
scripting ×1
t-sql ×1
trigger ×1
view ×1