SQL Server:执行删除大量查询
我有下面这样的问题,我有50000多个。当我一次开始执行这些查询时,需要很长时间SQL Server:执行删除大量查询,sql,sql-server,database,Sql,Sql Server,Database,我有下面这样的问题,我有50000多个。当我一次开始执行这些查询时,需要很长时间 DELETE FROM [dbo].[WrongEntry] WHERE CompanyId=1 AND EmployeeId = 3 AND Entry_Date = '2016-12-01' DELETE FROM [dbo].[Entry] WHERE CompanyId = 1 AND EmployeeId = 3 AND Entry_Date = '2016-12-01' AND Entry_Met
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId=1 AND EmployeeId = 3 AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1 AND EmployeeId = 3 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I'
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1 AND EmployeeId = 4 AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1 AND EmployeeId = 4 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I'
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1 AND EmployeeId = 6 AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1 AND EmployeeId = 6 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I'
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1 AND EmployeeId = 7 AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1 AND EmployeeId = 7 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I'
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1 AND EmployeeId = 14 AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1 AND EmployeeId = 14 AND Entry_Date = '2016-12-01' AND Entry_Method = 'I'
我对SQL Server没有太多的经验,请指导我如何以其他方式执行此操作,以提高性能。删除非常具体,我将考虑创建索引以加快此功能 这里有一个来自著名的SQL资源专家的免费资源,可以帮助您确定缺少的索引以及应该实现哪些索引 此外,您是否考虑过根据SQL Server的版本对表进行分区?基于日期戳的分区可能会大大提高SQL的性能,但这是一个更大的体系结构变化
删除非常具体,我会考虑创建一个索引来加速此功能 这里有一个来自著名的SQL资源专家的免费资源,可以帮助您确定缺少的索引以及应该实现哪些索引 此外,您是否考虑过根据SQL Server的版本对表进行分区?基于日期戳的分区可能会大大提高SQL的性能,但这是一个更大的体系结构变化 执行50000次删除需要一些时间。有一件事可能会让他们更快,那就是在两个表中都有一个关于
(CompanyId、EmployeeId、Entry\u Date)
的索引
第二件事是将这些列的值放入临时表中,并使用join
进行删除:
delete we
from wrong_entry we join
#todelete d
on we.companyid = d.companyid and
we.employeeid = d.employeeid and
we.entry_date = d.entry_date;
您仍然希望此操作的索引速度更快。但是,另外,这会将所有的删除放在同一个事务中,从而减少事务开销
实际上,您可以在事务中包装您的删除,这也可能加快代码的速度。执行50000次删除需要一些时间。有一件事可能会让他们更快,那就是在两个表中都有一个关于(CompanyId、EmployeeId、Entry\u Date)
的索引
第二件事是将这些列的值放入临时表中,并使用join
进行删除:
delete we
from wrong_entry we join
#todelete d
on we.companyid = d.companyid and
we.employeeid = d.employeeid and
we.entry_date = d.entry_date;
您仍然希望此操作的索引速度更快。但是,另外,这会将所有的删除放在同一个事务中,从而减少事务开销
实际上,您可以在事务中包装您的删除,这也可能加快代码的速度。根据您的示例查询,考虑到所有
员工ID的公司ID和输入日期都相同
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
AND Entry_Method = 'I'
对于上面的Delete
,创建下面的非聚集索引可以加快Delete
CREATE NONCLUSTERED INDEX IX_WrongEntry
ON WrongEntry (CompanyId,EmployeeId,Entry_Date);
CREATE NONCLUSTERED INDEX IX_Entry
ON Entry (CompanyId,EmployeeId,Entry_Date,Entry_Method);
根据您的示例查询,考虑到CompanyId
,Entry\u方法
和Entry\u日期
对于所有员工ID
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
AND Entry_Method = 'I'
对于上面的Delete
,创建下面的非聚集索引可以加快Delete
CREATE NONCLUSTERED INDEX IX_WrongEntry
ON WrongEntry (CompanyId,EmployeeId,Entry_Date);
CREATE NONCLUSTERED INDEX IX_Entry
ON Entry (CompanyId,EmployeeId,Entry_Date,Entry_Method);
如果您可以为每个员工指定不同的日期,则将值添加到临时表中,并根据您的示例查询加入删除记录,就像Gordan的答案一样,考虑到所有员工ID的公司ID
和输入日期都是相同的员工ID
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
AND Entry_Method = 'I'
对于上面的Delete
,创建下面的非聚集索引可以加快Delete
CREATE NONCLUSTERED INDEX IX_WrongEntry
ON WrongEntry (CompanyId,EmployeeId,Entry_Date);
CREATE NONCLUSTERED INDEX IX_Entry
ON Entry (CompanyId,EmployeeId,Entry_Date,Entry_Method);
根据您的示例查询,考虑到CompanyId
,Entry\u方法
和Entry\u日期
对于所有员工ID
DELETE FROM [dbo].[WrongEntry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
DELETE FROM [dbo].[Entry]
WHERE CompanyId = 1
AND EmployeeId in ( 3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
AND Entry_Method = 'I'
对于上面的Delete
,创建下面的非聚集索引可以加快Delete
CREATE NONCLUSTERED INDEX IX_WrongEntry
ON WrongEntry (CompanyId,EmployeeId,Entry_Date);
CREATE NONCLUSTERED INDEX IX_Entry
ON Entry (CompanyId,EmployeeId,Entry_Date,Entry_Method);
如果您可以为每个员工指定不同的日期,则将值添加到临时表中,并加入以删除记录,就像Gordan的回答一样限制单个事务中要删除的记录数:
DECLARE @RowCount INT = 1
WHILE @RowCount > 0 BEGIN
DELETE TOP(500) FROM [dbo].[WrongEntry]
WHERE CompanyId=1 AND EmployeeId IN (3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
SELECT @RowCount = @@ROWCOUNT
END
SELECT @RowCount = 1
WHILE @RowCount > 0 BEGIN
DELETE TOP(500) FROM [dbo].[Entry]
WHERE CompanyId=1 AND EmployeeId IN (3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
AND Entry_Method = 'I'
SELECT @RowCount = @@ROWCOUNT
END
限制单个事务中要删除的记录数:
DECLARE @RowCount INT = 1
WHILE @RowCount > 0 BEGIN
DELETE TOP(500) FROM [dbo].[WrongEntry]
WHERE CompanyId=1 AND EmployeeId IN (3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
SELECT @RowCount = @@ROWCOUNT
END
SELECT @RowCount = 1
WHILE @RowCount > 0 BEGIN
DELETE TOP(500) FROM [dbo].[Entry]
WHERE CompanyId=1 AND EmployeeId IN (3 ,4 , 6, 7, 14)
AND Entry_Date = '2016-12-01'
AND Entry_Method = 'I'
SELECT @RowCount = @@ROWCOUNT
END
我从我的mvc应用程序代码中获取所有这些查询,因此没有范围更改这些查询。@Anup-我不知道有关mvc
的内容,但如果您想改进,则必须更改它。顺便问一下,这两个表上都有索引吗?我已经在Entry_日期创建了Entry表上的索引。我还应该在哪里创建索引。我不知道索引,所以请告诉我索引的类型和列。@Anup-Updated试试看。注意,如果不查看数据,我们无法建议正确的索引。我无法从我的mvc应用程序代码中获取所有这些查询,因此没有范围更改这些查询。@Anup-我不知道有关mvc
的内容,但如果您想改进,则必须更改它。顺便问一下,这两个表上都有索引吗?我已经在Entry_日期创建了Entry表上的索引。我还应该在哪里创建索引。我不知道索引,所以请告诉我索引的类型和列。@Anup-Updated试试看。注意,如果不查看数据,我们无法建议适当的索引