0

SQL Server 用の次の SP があります。不思議なことに、クエリの実行時に SP の動作がおかしくなった

Select @max_backup_session_time = Max(MachineStat.BackupSessionTime) from MachineStat     where MachineStat.MachineID = @machine_id;

MachineStat テーブルに @machine_id に関する行がある場合は 1 秒かかりますが、@machine_id の行がない場合は、実行に 30 分以上かかります。誰かがこれを理解するのを手伝ってくれませんか。

SET NOCOUNT ON;

DECLARE @MachineStatsMId TABLE (
  MachineId         INT NULL,
  BackupSessiontime BIGINT NULL,
  MachineGroupName  NVARCHAR(128) NULL )
DECLARE @machine_id AS INT;
DECLARE @Machine_group_id AS INT;
DECLARE @machine_group_name AS NVARCHAR(128);
DECLARE @max_backup_session_time AS BIGINT;

SET @machine_id = 0;
SET @Machine_group_id = 0;
SET @machine_group_name = '';

DECLARE MachinesCursor CURSOR FOR
  SELECT m.MachineId,
         m.MachineGroupId,
         mg.MachineGroupName
  FROM   Machines m,
         MachineGroups mg
  WHERE  m.MachineGroupId = mg.MachineGroupId;

OPEN MachinesCursor;

FETCH NEXT FROM MachinesCursor INTO @machine_id, @machine_group_id, @machine_group_name;

WHILE @@FETCH_STATUS = 0
  BEGIN
      SELECT @max_backup_session_time = Max(MachineStat.BackupSessionTime)
      FROM   MachineStat
      WHERE  MachineStat.MachineID = @machine_id;

      INSERT INTO @MachineStatsMId
      VALUES      (@machine_id,
                   @max_backup_session_time,
                   @machine_group_name);

      FETCH NEXT FROM MachinesCursor INTO @machine_id, @machine_group_id, @machine_group_name;
  END;

SELECT *
FROM   @MachineStatsMId;

CLOSE MachinesCursor;

DEALLOCATE MachinesCursor;
GO
4

1 に答える 1

1

これは、カーソルとテーブル変数を完全に回避し、適切な (最新の) 結合とスキーマ プレフィックスを使用し、現在のものよりもはるかに高速に実行される代替バージョンです。それでも特定のシナリオで実行が遅い場合は、そのシナリオの実際の実行計画と、高速シナリオの実際の実行計画を投稿してください。

ALTER PROCEDURE dbo.procname
AS
BEGIN
  SET NOCOUNT ON;

  SELECT 
    m.MachineId, 
    BackupSessionTime = MAX(ms.BackupSessionTime), 
    mg.MachineGroupName
  FROM dbo.Machines AS m
  INNER JOIN dbo.MachineGroups AS mg 
    ON m.MachineGroupId = mg.MachineGroupId
  INNER JOIN dbo.MachineStat AS ms -- you may want LEFT OUTER JOIN here, not sure
    ON m.MachineId = ms.MachineID
  GROUP BY m.MachineID, mg.MachineGroupName;
END
GO
于 2012-08-10T14:47:48.160 に答える