Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:执行删除大量查询_Sql_Sql Server_Database - Fatal编程技术网

SQL Server:执行删除大量查询

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

我有下面这样的问题,我有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_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试试看。注意,如果不查看数据,我们无法建议适当的索引