小编gar*_*rik的帖子

如何更改触发器的触发顺序?

我真的很少使用触发器。所以我第一次遇到了一个问题。我有很多带有触发器的表(每个表有 2 个或更多)。我想知道并更改每个表的触发顺序。是否有可能获得这些信息?

添加:

这是我发现的关于 mssqltips 的一篇很好的文章

trigger sql-server-2005 sql-server-2008

12
推荐指数
3
解决办法
3926
查看次数

为什么这个查询会导致死锁?

为什么这个查询会导致死锁?

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的文章,其中提供了如何避免此类死锁的解决方案: …

sql-server-2008 deadlock

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

非企业版和性能的 noexpand 提示

我必须使用索引视图来达到性能。正如我从这个比较表中看到的,标准版不支持索引视图。但是 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)

performance sql-server-2008 clustered-index view

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

使用总计来提高性能

我有两个表:详细信息和这些详细信息的总计。

详细信息(缓慢的解决方案):

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

7
推荐指数
1
解决办法
2130
查看次数

动态创建的数据库的 LDF 和 MDF 文件大小

我正在从 C# 代码创建一个动态数据库,并希望数据库具有固定大小(例如 5 GB)。通过代码创建数据库时,我需要指定 MDF 和 LDF 最大文件大小。理想值应该是多少?每个 2.5GB 还是它们的其他比例?

我必须确保总数据库大小不超过 5GB,所以我应该只担心 MDF 大小(将其固定在 5GB)并让 LDF 大小无限增长(我不能这样做,但如果它受到伤害性能那么我必须考虑一下)?

谢谢,维维克

database-design sql-server

7
推荐指数
1
解决办法
1317
查看次数

我的功能是不确定的吗

我有两个函数:fn_Without_Paramfn_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 有一些公共标记。为什么第二个函数更慢?

performance sql-server determinism

6
推荐指数
1
解决办法
201
查看次数

如何管理我自己的脚本

每个管理员、开发人员都有自己的脚本集合(一些模式)。他们有时会被解雇一份工作,而他们又受雇于另一份工作。有没有好的、好用的、有索引的工具来收集常用的sql脚本(默认结构化文件夹/文件系统)?

best-practices scripting

6
推荐指数
1
解决办法
432
查看次数

如何通过使用或不使用表变量来提高性能

我有一个表变量:

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 执行?

添加:

在此处输入图片说明

performance sql-server-2008 execution-plan

6
推荐指数
1
解决办法
498
查看次数

如何获取默认语言的文本

我有这样的表: 在此处输入图片说明

因此语言表中的数据:

在此处输入图片说明

因此文本表中的数据: 在此处输入图片说明

我必须返回请求语言的文本(如果存在)默认语言的文本(如果它不存在)。是否可以在一个查询中做到这一点(不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”(乌克兰语)文本,而这不是该语言的任何文本,那么它将搜索俄语文本。如果找到 - 好的,如果没有,它将寻找英文文本。语言列表可能会有所不同。

sql-server-2008 query cte t-sql

6
推荐指数
1
解决办法
1260
查看次数

行填充以获得更高的性能

我读过一篇文档(设计高度可扩展的 OLTP 系统),其中描述了如何获得更高性能的技巧:

由于行很小(很多适合一页),多个锁可能会争用一个 PAGELATCH。我们可以“浪费”一点空间来获得更多性能。解决方案:用 CHAR 列填充行以使每一行占据整页。

有没有人使用这种方法?你得到了什么结果?

谢谢你。

添加:

警告。链接的文章不是行动指南。Thomas Kejser描述了对 TB 级数据库的测试,仅此而已

performance sql-server

6
推荐指数
1
解决办法
487
查看次数