4

クエリのパフォーマンスが遅く、SQLの知識が少し多い人がパフォーマンスの向上に役立つことを期待していました。

ソースとコモンの2つのテーブルがあり、日付、時刻、文字列(whchはサーバー名)に加えて、いくつかのデータをロードします。

ソーステーブルには、40k以上の行を含めることができます(30の奇数列、int、日付、時刻、およびいくつかのvarchar(255)/(最大)の組み合わせがあります。

以下のクエリを使用して、ソースにあるCommonからデータを削除します。

'Delete from Common where convert(varchar(max),Date,102)+convert(varchar(max),Time,108)+[ServerName] in (Select convert(varchar(max),[date],102)+convert(varchar(max),time,108)+ServerName from Source where sc_status < 300)'

ソースフィールドは次の形式です。

  • ServerName varchar(255)IE SN1234
  • 日付varchar(255)IE 2012-05-22
  • 時間varchar(255)IE 08:12:21

共通フィールドは次の形式です。

  • ServerName varchar(255)IE SN1234
  • 日付日付IE2011-08-10
  • 時間time(7)IE 14:25:34.0000000

ありがとう

4

4 に答える 4

5

両側を文字列に変換し、それらを1つの大きな文字列に連結して、それらの結果を比較することはあまり効率的ではありません。必要な場所でのみ変換を行います。この例を試して、比較方法を確認してください。

DELETE c
  FROM dbo.Common AS c
  INNER JOIN dbo.Source AS s
  ON s.ServerName = c.ServerName
  AND CONVERT(DATE, s.[Date]) = c.[Date]
  AND CONVERT(TIME(7), s.[Time]) = c.[Time]
  WHERE s.sc_status < 300;
于 2012-05-22T21:30:36.850 に答える
0

これらの変換はすべてVARCHAR(MAX)不要であり、おそらく速度が低下します。代わりに、次のようなものから始めます。

DELETE c
from [Common] c
WHERE EXISTS(
    SELECT 1
    FROM Source
    WHERE CAST([Date] AS DATE)=c.[Date]
    AND CAST([Time] AS TIME(7))=c.[Time]
    AND [ServerName]=c.[ServerName]
    AND sc_status < 300
);
于 2012-05-22T21:21:44.943 に答える
0

何かのようなもの

Delete from Common inner join Source 
On Common.ServerName = Source.ServerName 
and Common.Date = Convert(Date,Source.Date)
and Common.Time = Convert(Time, Source.Time)
And Source.sc_Status < 300

その後遅すぎる場合は、両方のテーブルで可能ないくつかのインデックスが必要です。

于 2012-05-22T21:36:31.127 に答える
0

不必要な変換を削除すると、アーロンの回答で詳しく説明されているように、非常に役立ちます。また、ログテーブルの上にインデックス付きビューを作成することを検討することもできます。これは、おそらくそのスキーマにあまり柔軟性がないか、ログパーサーからDMLを挿入するためです。

簡単な例:

create table dbo.[Source] (LogId int primary key, servername varchar(255), 
   [date] varchar(255), [time] varchar(255));
insert into dbo.[Source]
    values  (1, 'SN1234', '2012-05-22', '08:12:21'),
            (2, 'SN5678', '2012-05-23', '09:12:21')
go

create view dbo.vSource with schemabinding
as
    select  [LogId],
            [servername], 
            [date], 
            [time], 
            [actualDateTime] = convert(datetime, [date]+' '+[time], 120)
    from    dbo.[Source];
go

create unique clustered index UX_Source on vSource(LogId);
create nonclustered index IX_Source on vSource(actualDateTime);

これにより、挿入のパフォーマンスをいくらか犠牲にして実行プランを探し、大幅に改善するためのインデックス付き日時列が提供されます。

于 2012-05-22T21:57:44.520 に答える