【问题标题】:SELECT query on large table大表上的 SELECT 查询
【发布时间】:2012-10-30 13:09:19
【问题描述】:

我需要查看/重构针对表(超过 10 万行)的现有存储过程。存储过程签名不能轻易更改,如下所示。

存储过程接受两个由管道分隔的字符串,并使用 SQL 函数 (SplitDelimitedVarChar) 将字符串拆分为一个临时表,然后在实际选择中使用该临时表。 array 字符串中的字符串数量范围从 1 到数千。

DateValue 和 TimeValue 列包含行中时间戳的 int 表示形式。

我的问题是,如果这是一个好的(最好的?)解决方案,或者是否可以做得更好,是否有人有任何想法。主要问题是它是否可以针对速度进行优化?

由于只能通过此存储过程访问表,因此索引与 WHERE 列是非聚集的,并且包括所有 SELECT 列。

感谢您的任何建议或指点。

CREATE PROCEDURE [dbo].[spdata_Get_Ana]
@beginTime INT,
@endTime INT,
@subscribers VARCHAR(MAX),
@exchanges VARCHAR(MAX) = '1:',
@beginDateValue int, 
@endDateValue int,
@target int = 1
AS  
BEGIN
SET NOCOUNT ON;

CREATE TABLE #exch (Item Varchar(20) COLLATE database_default)
INSERT INTO #exch
SELECT Item FROM [SplitDelimitedVarChar] (@exchanges, '|') ORDER BY Item
CREATE CLUSTERED INDEX idx ON #exch (Item)

CREATE TABLE #subs (Item Varchar(20) COLLATE database_default)
INSERT INTO #subs
SELECT Item FROM [SplitDelimitedVarChar] (@subscribers, '|') ORDER BY Item
CREATE CLUSTERED INDEX idx ON #subs (Item)

SELECT 
   [Id]
  ,'' AS 'Name'
  ,[NameId]
  ,[Level]
  ,[Ne]
  ,[CallId]
  ,[Bg]
  ,[DateTime]
  ,[TimeStamp]
  ,[LogOwnerSnb]
  ,[TypeOfLog]
  ,[AbsenceCode]
  ,[AnswerTime]
  ,[CallForwardingReason]
  ,[CallForwardingToNumber]
  ,[CallTransferTime]
  ,[CallTransferReason]
  ,[SeizedSubscriberType]
  ,[SeizedSubscriberTime]
  ,[SeizedSubscriberNumber]
  ,[CalledSubscriberService]
  ,[InSubscriberType]
  ,[InSubscriberNumber]
  ,[CallDirection]
  ,[SubscriberService]
  ,[ClearingCause]
  ,[ClearingCauseTime]
  ,[OnHookTime]
  ,[OutAnswerSubType]
  ,[OutAnswerTime]
  ,[OutAnswerSubNum]
  ,[RingingStartedTime]
  ,[ReroutedToNumber]
  ,[InitiatedService]
  ,[B26]
FROM [dbo].[data_centrex_Ana] AS A
WHERE
    (A.[DateValue] BETWEEN @beginDateValue AND @endDateValue)
AND
    EXISTS(SELECT [Item] FROM #exch WHERE [Item] = A.[Level])
AND
    (A.[TimeValue] BETWEEN @beginTime AND @endTime)
AND
(
   (@target = 1 AND EXISTS(SELECT [Item] FROM #subs WHERE [Item] = A.[LogOwnerSnb]))
   OR
   (@target = 2 AND EXISTS(SELECT [Item] FROM #subs WHERE [Item] = A.[Bg]))
)
END

【问题讨论】:

    标签: sql-server tsql stored-procedures


    【解决方案1】:

    怀疑在索引中包含选择列有什么好处。
    这只是一个大索引。

    尝试加入

    SELECT [Id]  
    FROM [dbo].[data_centrex_Ana] AS A 
    JOIN #exch   
     ON [Item] = A.[Level] 
    JOIN #subs    
      ON (@target = 1 AND [Item] = A.[LogOwnerSnb])   
      OR (@target = 2 AND [Item] = A.[Bg]) 
    WHERE
         (A.[DateValue] BETWEEN @beginDateValue AND @endDateValue) 
    AND  (A.[TimeValue] BETWEEN @beginTime AND @endTime)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多