我有一个包含很多网上商店产品的数据库。当我尝试删除时,我得到了一个
交易日志已满
异常。我去了我的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行。我的桌子设计怎么样 - 效率低下?
答案 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项目限制可怜。我们在这说什么? 16mb日志空间?