簡體   English   中英

使用左連接SQL Server時如何提高搜索速度?

[英]How to improve the search speed when using left join SQL Server?

在 SQL Server 中,我從兩個VIEW查詢數據以獲取OLDPID為 -1,-2 的記錄:

SELECT 
    T1.*, T2.LEAF 
FROM 
    (SELECT * 
     FROM VIEW_OBJECT_TREE_DATA  
     WHERE OLDPID IN (-1, -2)) T1
LEFT JOIN 
    VIEW_OBJECT_TREE_DATA_GROUP T2 ON T1.NODEID = T2.NODEPID 
WHERE 
    T1.STATE = 1

但是需要3-4秒才能得到結果。

如何修改此 SQL 查詢以提高其速度?

VIEW_OBJECT_TREE_DATA有 OLDPID、OLDID 和 NAME 列,有 450000 條記錄。 VIEW_OBJECT_TREE_DATA_GROUP有 NODEPID 和 LEAF,有 65000 條記錄。

下面是一些視圖和函數的sql:VIEW_OBJECT_TREE_DATA:

CREATE VIEW dbo.VIEW_OBJECT_TREE_DATA
AS
SELECT(SELECT[dbo].[FNNC_GET_TREE_GUID](0, OBJECT_ID)) AS NODEID,
                    (SELECT[dbo].[FNNC_GET_TREE_GUID](0, PARENT_ID)) AS NODEPID, 'MY_OBJECT_TABLE' AS[TABLE],   
                OBJECT_ID AS OLDID, PARENT_ID AS OLDPID, OBJECT_NAME COLLATE DATABASE_DEFAULT AS NAME,   
                OBJECT_CODE COLLATE database_default AS CODE, OBJECT_TYPE COLLATE database_default AS TYPE,  
                OBJECT_STATE as STATE
FROM dbo.MY_OBJECT_TABLE
WHERE   OBJECT_STATE <> -1
UNION
SELECT(SELECT[dbo].[FNNC_GET_TREE_GUID](1, INDICATOR_ID)) AS NODEID,
                    (SELECT[dbo].[FNNC_GET_TREE_GUID](0, OBJECT_ID)) AS NODEPID, 'MY_INDICATOR_TABLE' AS[TABLE],   
                INDICATOR_ID AS OLDID, OBJECT_ID AS OLDPID, INDICATOR_NAME COLLATE DATABASE_DEFAULT AS NAME,   
                INDICATOR_CODE COLLATE database_default AS CODE, INDICATOR_TYPE COLLATE database_default AS TYPE,  
                INDICATOR_STATE AS STATE
FROM      dbo.MY_INDICATOR_TABLE
WHERE   INDICATOR_STATE <> -1

VIEW_OBJECT_TREE_DATA_GROUP :

CREATE VIEW VIEW_OBJECT_TREE_DATA_GROUP  
AS
SELECT NODEPID,COUNT(0) AS LEAF FROM VIEW_OBJECT_TREE_DATA GROUP BY NODEPID  

功能:

USE[MY_DATABASE]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION[dbo].[FNNC_GET_TREE_GUID](@TYPE INT, @ID INT)
RETURNS UNIQUEIDENTIFIER
AS
BEGIN

    RETURN CAST(CAST(@TYPE AS binary(4))+CAST(@ID AS varbinary(28)) AS UNIQUEIDENTIFIER)
END

您可以直接連接這兩個視圖,而無需使用子查詢。

select TD.*, DG.LEAF 
from VIEW_OBJECT_TREE_DATA as TD
     left join VIEW_OBJECT_TREE_DATA_GROUP as DG on DG.NODEPID = TD.NODEID
where TD.OLDPID in (-1, -2) and
      TD.STATE = 1

盡管沒有看到這些視圖和執行計划,就無法知道是什么讓你慢下來了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM