标签: sql-server

Sql Server删除和合并性能

我的表中包含一些买入/卖出数据,其中包含大约8M的记录:

CREATE TABLE [dbo].[Transactions](
[id] [int] IDENTITY(1,1) NOT NULL,
[itemId] [bigint] NOT NULL,
[dt] [datetime] NOT NULL,
[count] [int] NOT NULL,
[price] [float] NOT NULL,
[platform] [char](1) NOT NULL
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

每个X分钟我的程序为每个itemId获取新的事务,我需要更新它.我的第一个解决方案是两步DELETE + INSERT:

delete from Transactions where platform=@platform and itemid=@itemid
insert into Transactions (platform,itemid,dt,count,price) values (@platform,@itemid,@dt,@count,@price)
[...]
insert into Transactions (platform,itemid,dt,count,price) values (@platform,@itemid,@dt,@count,@price)
Run Code Online (Sandbox Code Playgroud)

问题是,这个DELETE语句平均需要5秒.这太长了.

我找到的第二个解决方案是使用MERGE.我创建了这样的存储过程,wchich采用表值参数:

CREATE PROCEDURE [dbo].[sp_updateTransactions]
@Table dbo.tp_Transactions readonly,
@itemId bigint,
@platform char(1)
AS
BEGIN
MERGE Transactions AS TARGET
USING @Table AS SOURCE  
ON (    
TARGET.[itemId] …
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server merge sql-delete

7
推荐指数
2
解决办法
4530
查看次数

异步ADO.NET

我正在尝试编写一个查询SQL Server数据库的异步服务器,并担心我的数据库端过于同步.具体来说,我可以ExecuteReader异步调用但不能reader.Item异步调用,并且是花费57%的时间(阻止我的宝贵线程!).

这是我用ADO.NET做的最异步的,还是有异步方法reader.Item呢?

c# sql-server ado.net f#

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

MSSQL:在另一个表中选择出现次数超过2的行

基本上我需要获得在StaffOnGrade中出现超过2次的CampaignTitles列表,并列出等级等级高于2的CampaignTitle,StaffNo

WorksOn表:

CampaignTitle      | StaffNo
-------------------|--------
ADVENTURE WORLD    | 11
AIR CANADA         | 11
CARNIVAL CRUISES   | 3
CARNIVAL CRUISES   | 8
CARNIVAL CRUISES   | 9
FLIGHT CENTRE      | 7
FLIGHT CENTRE      | 10
HARVEYWORLD TRAVEL | 4
LAST MINUTE        | 4
PRINCESS CRUISES   | 3
PRINCESS CRUISES   | 5
PRINCESS CRUISES   | 6
PRINCESS CRUISES   | 7
PRINCESS CRUISES   | 11
TRAVELSCENE        | 10
VALUETOURS AUST    | 3
VIRGIN AUSTRALIA   | 10
Run Code Online (Sandbox Code Playgroud)

StaffOnGrade表:

Grade | StaffNo
------|--------
1     | …
Run Code Online (Sandbox Code Playgroud)

sql sql-server

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

在SQL Server中删除240行11秒

我正在运行删除声明:

DELETE FROM TransactionEntries
WHERE SessionGUID = @SessionGUID
Run Code Online (Sandbox Code Playgroud)

删除的实际执行计划是:

Execution Tree
--------------
Clustered Index Delete(
   OBJECT:([GrobManagementSystemLive].[dbo].[TransactionEntries].IX_TransactionEntries_SessionGUIDTransactionGUID]), 
   WHERE:([TransactionEntries].[SessionGUID]=[@SessionGUID])
)
Run Code Online (Sandbox Code Playgroud)

该表是聚集的SessionGUID,因此240行在物理上在一起.

该表没有触发器.

该操作需要:

  • 持续时间:11821毫秒
  • CPU:297
  • 阅读:14340
  • 写道:1707

该表包含11个索引:

  • 1聚集索引(SessionGUID)
  • 1个唯一(主键)索引
  • 9个其他非唯一的非聚集索引

我怎么能弄清楚为什么这个delete操作正在执行14,340读取,需要11秒?

  • Avg. Disk Read Queue Length河段0.8
  • Avg. Disk sec/Read不超过4ms
  • Avg. Disk Write Queue Length河段0.04
  • Avg. Disk sec/Write不超过4ms

其他读物有哪些?执行计划没有说明它正在阅读什么.


更新:

EXECUTE sp_spaceused TransactionEntries

TransactionEntries  
  Rows      6,696,199
  Data: …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2000

7
推荐指数
2
解决办法
221
查看次数

SQL Server - 使用当前的GetDate过滤器创建模式绑定索引视图

我想创建以下索引视图:

CREATE VIEW [Cic].[vwMarker] WITH SCHEMABINDING 
    AS

    Select
        SubId,
        marker.EquipmentID,
        marker.ReadTime,
        marker.CdsLotOpside,
        marker.CdsLotBackside,
        marker.CdteLotOpside,
        marker.CdTeLotBackside
    From dbo.Marker 
    Where dbo.Marker.ReadTime >= Convert(dateTime,'10/5/2011',120)
GO

CREATE UNIQUE CLUSTERED INDEX IX_vwMarker_ReadTime_EquipmentID 
       ON Cic.vwMarker (ReadTime, EquipmentID);
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,我真正想要做的是在此视图中仅包含两天或更新的行,从查询视图的当前日期/时间开始.我找不到这样做的方法,因为我不能在Where谓词中使用GetDate(),因为它是非确定性的.换句话说,我想做这样的事情,但不能:

Where dbo.Marker.ReadTime >= Convert(dateTime,DateAdd(dd,-2,GetDate()) ,120)
Run Code Online (Sandbox Code Playgroud)

有没有解决的办法?

sql-server indexed-view sql-server-2008

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

Erlang和MS SQL Server

我有Erlang R14B04(在centos下),它应该与MS SQL Server 2008(在Windows下)通信.有人可以分享这个未知领域的经验吗?据我所知,没有像jdbc这样的驱动程序但是对于erlang?我应该使用什么驱动程序?我看到有些人使用odbc这个帖子并得到负面反馈.有人可以证实吗?

sql-server erlang

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

在SQL Server中散列超过8000个字节

SQL Server的散列函数HASHBYTES的输入限制为8000字节.

你如何散列更大的字符串?

t-sql sql-server sqlclr sql-server-2008

7
推荐指数
2
解决办法
5110
查看次数

如何从2个表中获取最大值

使用Sql Server

我想从两个表中获得最大值

表格1

ID Total

101 100
102 600
.....
Run Code Online (Sandbox Code Playgroud)

表2

ID Total

101 300
102 400
....
Run Code Online (Sandbox Code Playgroud)

我希望根据id从2表中获取最大值

预期产出

ID Total

101 300 (max value in table2)
102 600 (max value in table1)
....
...
Run Code Online (Sandbox Code Playgroud)

如何进行查询

需要查询帮助

sql sql-server sql-server-2005

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

SQL触发器 - 如何获取更新的值?

如何在SQL触发器中获取更新记录的值 - 如下所示:

CREATE TRIGGER TR_UpdateNew
   ON  Users
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    EXEC UpdateProfile (SELECT UserId FROM updated AS U);

END
GO
Run Code Online (Sandbox Code Playgroud)

显然这不起作用,但你可以看到我想要的东西.

sql t-sql sql-server triggers

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

SQL Server varbinary(max)到Image数据类型

我有一个数据库表,将图像存储为varbinary(max).这对我很有用.但是,我现在必须将此数据发送到必须使用Image数据类型的MS Dynamics数据库.

将varbinary(max)保存到图像时,我需要注意什么?我的数据可以被破坏,或者它们通常是所有意图和目的的相同数据类型吗?

谢谢

sql-server image

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