无法从SQL Server中删除

时间:2011-04-18 11:44:46

标签: c# sql sql-server

我有一个包含很多网上商店产品的数据库。当我尝试删除时,我得到了一个

  

交易日志已满

异常。我去了我的WebHotel提供商并告诉他们,他们回复说我无法在一次交易中删除13444行,但必须以例如增量删除它们。 100。

有没有人听说过这个?

编辑这是我的表

CREATE TABLE [dbo].[PProduct](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [Name] [nvarchar](150) NOT NULL,
    [ProductUrl] [nvarchar](500) NOT NULL,
    [ImageUrl] [nvarchar](500) NOT NULL,
    [Description] [nvarchar](4000) NOT NULL,
    [Price] [money] NOT NULL,
    [BeforePrice] [money] NULL,
    [ShortDescription] [nvarchar](4000) NOT NULL,
    [ProductId] [int] NOT NULL,
    [PCategoryId] [nvarchar](100) NOT NULL,
    [PProgramName] [int] NOT NULL,
    [FrontPage] [bit] NULL,
    [FrontPageText] [ntext] NULL,
    [VersionNo] [nvarchar](50) NULL,
    [UserName] [nvarchar](255) NULL,
    [ShopName] [nvarchar](150) NULL,
    [FeedId] [int] NULL,
 CONSTRAINT [PK_PProduct] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

GO

他们说我的每个删除都占用256Kb,而且我有75Mb的日志空间。这是我可以在一次交易中删除的大约300行。我的桌子设计怎么样 - 效率低下?

4 个答案:

答案 0 :(得分:2)

喜欢这个

SELECT 'Starting' --sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
    DELETE TOP (100) MyTable WHERE ...

但是13k行是花生。乖乖。 size 是这些行......?

答案 1 :(得分:1)

这是因为您的数据库日志文件最大大小受到提供商的限制。您可以使用以下查询删除它们:

假设您的表中有一个唯一的主键名为Id

While(Exists(SELECT * FROM MyTable))
BEGIN
   DELETE FROM MyTable 
      WHERE Id IN (SELECT TOP(100) Id FROM MyTable)
END

答案 2 :(得分:0)

SQL Server中的每个数据修改都应记录在事务日志中并存储在那里直到不再需要它为止(它所做的事务以一种或另一种方式结束,没有活动复制,数据已被写入数据文件和其他几个条件)。

如果事务日志中没有足够的空间来执行此操作,则会引发您看到的异常。

事务日志会不时被截断,并且通常会设置为在文件已满且无法截断的情况下自动增长。

在某些情况下,它既不会增长(因为它被设置禁止,或者磁盘上没有更多可用空间),也不会被截断。以下是阻止日志截断的可能原因列表:

http://msdn.microsoft.com/en-us/library/ms345414.aspx

任何合理调整的数据库中的事务日志都应足够大,以便删除10K个记录(除非它们非常大,例如保存大图像,二进制数据等)。

答案 3 :(得分:0)

是的,这意味着您的主机运行方式意味着您在服务器崩溃时丢失数据,而无法进行备份。检查有关数据丢失和恢复方案的SLA。

它表明你有:

  • 日志中的空间非常小(仅足以删除100个项目)
  • 每次提交后都会回收日志空间。

这意味着:

  • 是的,主机是正确的,因为当你用完日志空间(可怜的金额)时,你无法在一次运行中删除14.000行。
  • 您也可能每天进行一次备份。如果服务器出现故障,这是一个重要的问题。专业设置将:(a)保持日志直到下一次备份和(b)每日备份数据库,并像每小时备份日志一样,这样您就可以回到“最后一小时”。在您的情况下,您可能会失去23.9小时的更改。

技术上100项目限制可怜。我们在这说什么? 16mb日志空间?