Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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_Tsql_Stored Procedures - Fatal编程技术网

Sql server 加速sql存储过程

Sql server 加速sql存储过程,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,每次应用程序执行删除操作时,我都必须执行以下存储过程。我的问题是,如果你们中有人知道一些方法,可以加速这个存储过程 DECLARE @CID UNIQUEIDENTIFIER SET @CID = @CategoryId DELETE FROM Elements WHERE CategoryId = @CID AND ParentId IS NOT NULL AND ParentId NOT IN (SELECT ElementId FROM Elements WHERE Category

每次应用程序执行删除操作时,我都必须执行以下存储过程。我的问题是,如果你们中有人知道一些方法,可以加速这个存储过程

DECLARE @CID UNIQUEIDENTIFIER
SET @CID = @CategoryId


DELETE FROM Elements 
WHERE CategoryId = @CID
AND ParentId IS NOT NULL
AND ParentId NOT IN (SELECT ElementId FROM Elements WHERE CategoryId = @CID)


WHILE (@@ROWCOUNT  > 0)
BEGIN
    DELETE FROM Elements
    WHERE CategoryId = @CID
    AND ParentId IS NOT NULL
    AND ParentId NOT IN (SELECT ElementId FROM Elements WHERE CategoryId = @CID)
END
结构如下:

Element 1
Element 2
    Element 2.1
    Element 2.2
    Element 2.3
        Element 2.3.1
        Element 2.3.2
Element 3
...
例如,如果删除了“元素2”,则也必须删除所有子元素

查询的工作原理: 如果我删除“Element 2”并执行存储过程,第一条删除语句将删除“Element 2.1”、“Element 2.2”和“Element 2.3”,因为在表中找不到它的ParentId(“Element 2”的ElementId)。之后,将执行第二条删除语句。这一次,同一条语句找不到在执行之前删除的元素的任何elementId

重要提示: 在执行存储过程之前,应用程序已删除一个元素。之后,整个结构将被保存。之后,父级不存在的所有元素都将通过存储过程删除

DECLARE @CID UNIQUEIDENTIFIER
SET @CID = @CategoryId


DELETE FROM Elements 
WHERE CategoryId = @CID
AND ParentId IS NOT NULL
AND ParentId NOT IN (SELECT ElementId FROM Elements WHERE CategoryId = @CID)


WHILE (@@ROWCOUNT  > 0)
BEGIN
    DELETE FROM Elements
    WHERE CategoryId = @CID
    AND ParentId IS NOT NULL
    AND ParentId NOT IN (SELECT ElementId FROM Elements WHERE CategoryId = @CID)
END
该环境是SQL Server 2008 R2。 提前谢谢你

安德烈

试试这个解决方案-

SET NOCOUNT ON;

DECLARE @Node NVARCHAR(50)
SELECT @Node = 'Element 2.3'

DECLARE @temp TABLE
(
  Node NVARCHAR(50) PRIMARY KEY
, ParentNode NVARCHAR(50) NULL 
)

INSERT INTO @temp (Node, ParentNode)
VALUES 
('Element 1', NULL),
('Element 2', NULL),
('Element 2.1', 'Element 2'),
('Element 2.2', 'Element 2'),
('Element 2.3', 'Element 2'),
('Element 2.3.1', 'Element 2.3'),
('Element 2.3.2', 'Element 2.3'),
('Element 3', NULL)

; WITH nodes (Node) AS 
(
SELECT d.Node
FROM @temp d
WHERE d.Node = @Node

UNION ALL

SELECT d.Node
FROM @temp d
JOIN nodes d3 ON d3.Node = d.ParentNode
)

DELETE FROM t
FROM @temp t
JOIN nodes n ON t.Node = n.Node

SELECT * 
FROM @temp

我不明白第二条删除语句是什么意思。它当然是多余的,因为第一次删除将删除所有必要的
元素
?第二次删除看起来与前面指出的第一次删除没有任何不同。它是一个树结构。如果您删除了一个包含子元素的元素,那么这些子元素也必须被删除。@Andre您没有删除任何子元素。两个查询的作用完全相同。@Andre在这种情况下,您可以通过删除第二条delete语句来加速存储过程(非常非常轻微)——它什么都不做!