我做了很多谷歌搜索,但我不能解决这个问题。
在没有其他查询运行的情况下,只有一个SQL事件探查器和我自己的SQL Management Studio副本连接到我的服务器,我运行以下命令:
public static ArrayList<Librarian> getLibrarianRecords(String filename){
ArrayList<Librarian> fromFile = new ArrayList<>(); //Array of
// existing librarians
try{
FileInputStream fIS =
new FileInputStream(SYSTEM_PATH + filename);
ObjectInputStream oIS = new ObjectInputStream(fIS);
fromFile = (ArrayList<Librarian>)oIS.readObject();
} catch (IOException ex){
System.out.println("Failed to read from file " + ex.getMessage());
ex.printStackTrace(); //Catches an IO exception.
} catch (ClassNotFoundException ex){
System.out.println("Error class not found" + ex.getMessage());
ex.printStackTrace(); //Catches a class not found
// exception.
}
return fromFile; //Returns the array list.
}
运行此查询时,我观察到Microsoft的SQL事件探查器。我看到成千上万的消息说:
delete_more:
DELETE TOP (200) A
FROM someTable
WHERE parentId = 15
IF @@ROWCOUNT > 0 GOTO delete_more;
该表没有触发器,也没有外键引用此表。在where子句中的列已建立索引。
似乎仅每2-3秒删除100条记录。我大约有100万条记录要通过这种方式删除,这将需要8个小时以上的时间。
我的机器运行缓慢,并且为数据库分配了8GB的RAM。
我不确定这是否是一个线索,但是当我对数据库运行探查器时,当没有应用程序或人们对它运行查询时,我经常看到Lock:Acquired和Lock:Released(没有SQL,RPC和SP语句开始)。这是典型的吗?
尽管我一直在谷歌搜索,但我不是DBA。我一直在玩:
Lock:Timeout (51983df52b56)
Lock:Timeout (d89e387017b0)
Lock:Timeout (21d253e7f2bc)
Lock:Timeout (c1e67d683600)
Lock:Timeout (38aa16ffd30c)
Lock:Timeout (008f2176bf79)
...但是实际上输出对我来说意义不大。我一直在谷歌搜索以了解每个脚本和其他人的脚本以提供更有意义的输出,但是目前我的MSSQL知识还不足以使其中的大部分内容变得有意义(我是没有DBA的计算机程序员人员)。