Sql lps

Sql lps,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,问候, Rosssys.dm\u db\u缺少索引\u详细信息的结果是什么?将CTE更改为临时表。(注意,不是表变量)您似乎有作为搜索条件提供的字段索引,如status和TXT\u inout,但这些字段未被使用。这些是否真的限制了数据量?统计io输出可能也会有帮助。如果您打算使用NOLOCK(我不推荐使用),至少要在语法上正确使用它。不赞成省略WITH关键字。此外,你应该绝对确定你完全理解这个暗示。大多数人认为这只是肮脏的阅读。这似乎比那更险恶。您能发布实际的表定义和索引吗?此外,发布实际执行

问候,


Ross

sys.dm\u db\u缺少索引\u详细信息的结果是什么?将CTE更改为临时表。(注意,不是表变量)您似乎有作为搜索条件提供的字段索引,如
status
TXT\u inout
,但这些字段未被使用。这些是否真的限制了数据量?统计io输出可能也会有帮助。如果您打算使用NOLOCK(我不推荐使用),至少要在语法上正确使用它。不赞成省略WITH关键字。此外,你应该绝对确定你完全理解这个暗示。大多数人认为这只是肮脏的阅读。这似乎比那更险恶。您能发布实际的表定义和索引吗?此外,发布实际执行计划而不是图片将非常有用。但上述查询需要将近14秒才能返回结果。我问题中的查询在更改某些条件后需要16秒才能返回结果。如何进一步减少查询执行时间?在我的示例中,每个select语句需要多长时间?试图了解瓶颈在哪里。好问题-我不确定聚集索引中是否使用了Pk_Id。如果主键(Pk_Id)上有聚集索引,则不需要包含它。查看我在上面第1点之后包含的索引示例。索引以KeyreferenceStatus='L'结尾。这是一个过滤索引,将是一个比仅为该列创建一个包含所有值的非聚集索引更有效的索引。很好的一点-我想在中使用一个
,而不是
EXISTS
。从我所看到的
EXISTS
和左侧外部连接的性能非常相似,并且
中的
可以有非常不同的执行计划。
Select F.PKID, F.RegNo
From
(
  Select E.PKID, E.RegNo 
  Row_Number() Over(Order By E.RegNo Asc) RowNo
  From
  (
    Select C.PKID, C.RegNo
    From
    (
      Select Pk_Id PKID, LTrim(RTrim(A.Reg_No)) RegNo, 
      Row_Number() Over(Partition By LTrim(RTrim(A.Reg_No)) 
      Order By (Select Null)) RegRowNo
      From dbo.KeyreferenceDetails A (NoLock)
      Where A.KeyreferenceStatus = 'L' 
      And A.Reg_No Like @Value And IsNull(Reg_No, '') <> '' And Not Exists
      (
        Select 1 From dbo.INVENTORY B (NoLock) 
        Where A.Reg_No = B.Inv_H_Reg_No
      ) 
    ) C
    Where C.RegRowNo = 1 And IsNull(C.RegNo, '') <> '-'
    Union
    Select D.PKID, D.RegNo
    From 
    (
      Select Pk_ID PKID, LTrim(LTrim(Txt_RegNo)) RegNo, 
      Row_Number() Over(Partition By LTrim(LTrim(A.Txt_RegNo)) 
      Order By (Select Null)) RegRowNo
      From dbo.MobileMessageDetails A (Nolock)  
      Left Join dbo.PLACE P (Nolock) On P.Place_Shrt_Code  = A.Txt_YarddCode 
      And P.[Status] = 'L'
      Left Join dbo.INVENTORY B (Nolock) On A.Txt_RegNo = B.Inv_H_Reg_No            
      Where A.Txt_INOUT In('IN', 'MOBILE') And IsNull(A.Txt_RegNo, '') <> '' And B.Inv_H_Pk_Id Is Null 
      And A.[Status] = 'L' And Txt_RegNo Like @Value 
    ) D
    Where D.RegRowNo = 1 And IsNull(D.RegNo, '') <> '-'
 ) E
) F
Where F.RowNo > 0 And F.RowNo <= 20
 Index Name ---------------+ Column Name ----------------- + Index Type
 IX_KeyreferenceDetails_I  |  Reg_No                       | NONCLUSTERED   
 IX_KeyreferenceDetails_II |  KeyreferenceStatus           | NONCLUSTERED
 Index Name ---------------+ Column Name ----------------- + Index Type
 IX_Inventory_I            | Inv_H_Reg_No                  | NONCLUSTERED   
 Index Name --------------- + Column Name ----------------- + Index Type
 IX_MobileMessageDetails_I  | Txt_RegNo                     | NONCLUSTERED
 IX_MobileMessageDetails_II | Txt_INOUT                     | NONCLUSTERED
 Index Name ---------------+ Column Name ----------------- + Index Type
 IX_Place_I                | Place_Shrt_Code               | NONCLUSTERED  
 IX_Place_I                | Status                        | NONCLUSTERED
SQL Server Execution Times:
CPU time = 0 ms,  elapsed time = 0 ms.
Table 'INVENTORY'. Scan count 6, logical reads 382, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'KeyreferenceDetails'. Scan count 15, logical reads 9062, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Mobile_MessageDetails'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#TempItemsCount_____________________________________________________________________________________________________0000000118A9'. Scan count 0, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 20733 ms,  elapsed time = 7844 ms.
Table 'INVENTORY'. Scan count 6, logical reads 382, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'KeyreferenceDetails'. Scan count 14, logical reads 9062, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Mobile_MessageDetails'. Scan count 1, logical reads 4, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#VehicleRegDetails__________________________________________________________________________________________________0000000118AB'. Scan count 0, logical reads 20, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

SQL Server Execution Times:
CPU time = 21139 ms,  elapsed time = 8146 ms.
Table '#TABLE_SCHEMA_______________________________________________________________________________________________________0000000118AA'. Scan count 0, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Insert Into #TempItemsCount(TotalCount)
Select Count(E.PKID)
From
 (
   Select E.PKID, E.RegNo 
      Row_Number() Over(Order By E.RegNo Asc) RowNo
      From
      (
        Select C.PKID, C.RegNo
        From
        (
          Select Pk_Id PKID, LTrim(RTrim(A.Reg_No)) RegNo, 
          Row_Number() Over(Partition By LTrim(RTrim(A.Reg_No)) 
          Order By (Select Null)) RegRowNo
          From dbo.KeyreferenceDetails A (NoLock)
          Where A.KeyreferenceStatus = 'L' 
          And A.Reg_No Like @Value And IsNull(Reg_No, '') <> '' And Not Exists
          (
            Select 1 From dbo.INVENTORY B (NoLock) 
            Where A.Reg_No = B.Inv_H_Reg_No
          ) 
        ) C
        Where C.RegRowNo = 1 And IsNull(C.RegNo, '') <> '-'
        Union
        Select D.PKID, D.RegNo
        From 
        (
          Select Pk_ID PKID, LTrim(LTrim(Txt_RegNo)) RegNo, 
          Row_Number() Over(Partition By LTrim(LTrim(A.Txt_RegNo)) 
          Order By (Select Null)) RegRowNo
          From dbo.MobileMessageDetails A (Nolock)  
          Left Join dbo.PLACE P (Nolock) On P.Place_Shrt_Code  = A.Txt_YarddCode 
          And P.[Status] = 'L'
          Left Join dbo.INVENTORY B (Nolock) On A.Txt_RegNo = B.Inv_H_Reg_No            
          Where A.Txt_INOUT In('IN', 'MOBILE') And IsNull(A.Txt_RegNo, '') <> '' And B.Inv_H_Pk_Id Is Null 
          And A.[Status] = 'L' And Txt_RegNo Like @Value 
        ) D
        Where D.RegRowNo = 1 And IsNull(D.RegNo, '') <> '-'
    ) E
 )
IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp;
GO
SELECT  PKID = Pk_Id, 
        RegNo = LTrim(RTrim(A.Reg_No)), 
        RegRowNo = Row_Number() Over(Partition By LTrim(RTrim(A.Reg_No)) Order By (Select Null))
INTO    #temp
FROM    dbo.KeyreferenceDetails A WITH(NOLOCK)
        LEFT OUTER JOIN dbo.INVENTORY B WITH(NOLOCK) ON A.Reg_No = B.Inv_H_Reg_No
WHERE   B.Inv_H_Reg_No IS NULL
AND     A.KeyreferenceStatus = 'L' 
And     A.Reg_No Like @Value 
And     A.Reg_No IS NOT NULL
AND     A.Reg_No <> '';

INSERT INTO #temp (PKID, RegNo, RegRowNo)
  SELECT  PKID = Pk_ID, 
          RegNo = LTrim(LTrim(A.Txt_RegNo)), 
          RegRowNo = Row_Number() Over(Partition By LTrim(LTrim(A.Txt_RegNo)) Order By (Select Null)) 
  FROM    dbo.MobileMessageDetails A WITH(NOLOCK)
          LEFT OUTER JOIN dbo.PLACE P WITH(NOLOCK) ON P.Place_Shrt_Code  = A.Txt_YarddCode AND P.[Status] = 'L'
          LEFT OUTER JOIN dbo.INVENTORY B WITH(NOLOCK) ON A.Txt_RegNo = B.Inv_H_Reg_No            
  WHERE   B.Inv_H_Pk_Id Is Null 
  AND     A.Status = 'L' 
  AND     A.Txt_RegNo Like @Value 
  And     A.Txt_RegNo IS NOT NULL
  AND     A.Txt_RegNo <> ''
  AND     A.Txt_INOUT In ('IN', 'MOBILE');

IF OBJECT_ID('tempdb..#final') IS NOT NULL DROP TABLE #final;
GO
SELECT  t.PKID, 
        t.RegNo,
        RowNo = Row_Number() Over(Order By t.RegNo Asc)
INTO    #final
FROM    #temp t;
WHERE   t.RegNo <> '-'

SELECT  F.PKID, F.RegNo
FROM    #final F
WHERE   F.RowNo BETWEEN 1 AND 20

GO
DROP TABLE #temp, #final