2017-03-11 17 views
1

以下のクエリが実行されるのに1分以上かかる理由を誰かに教えてもらえますか?SQL Serverの実行時間が長い

私は下の行コメントをする場合:

AND sys.fn_hadr_backup_is_preferred_replica(d.name) = 1 

をクエリが1秒未満で実行されます。

私はいくつかの代替案を探しています。

SELECT 
DISTINCT @@SERVERNAME AS ServerName , 
d.name AS DatabaseName , 
'Diff Backups Not Performed Recently' AS Finding , 
'Last differential backup: ' + COALESCE(CAST(MAX(b.backup_finish_date) AS VARCHAR(25)),'never') AS Details 
FROM master.sys.databases d 
    LEFT OUTER JOIN msdb.dbo.backupset b ON d.name COLLATE SQL_Latin1_General_CP1_CI_AS = b.database_name COLLATE SQL_Latin1_General_CP1_CI_AS 
    AND b.type = 'I' 
    AND b.server_name = SERVERPROPERTY('ServerName') /*Backupset ran on current server */ 
WHERE d.database_id <> 2 
    AND d.state NOT IN(1, 6, 10) /* Not currently offline or restoring, like log shipping databases */ 
    AND d.is_in_standby = 0 /* Not a log shipping target database */ 
    AND d.source_database_id IS NULL /* Excludes database snapshots */ 
    AND b.user_name = 'tsmadmin' 
    AND sys.fn_hadr_backup_is_preferred_replica(d.name) = 1 
GROUP BY d.name 
HAVING MAX(b.backup_finish_date) <= DATEADD(dd, -2, GETDATE()) 
    OR MAX(b.backup_finish_date) IS NULL; 
+0

使用のクロスが適用されますか? –

+1

UDFは、実行速度が遅く、オプティマイザがクエリを実行するのを妨げるために有名です。 –

+0

1つの方法は、列に関数を適用しないようにすることです。あなたの 'sys.fn_hadr_backup_is_preferred_replica'は何をしますか?決定的なのでインデックスに登録できますか?あなたの質問にそれを示すことができますか? –

答えて

1

これはgroup by機能を実行することは良い考えである場合も考えられるが。 whereからの関数呼び出しを削除し、having句にそれを追加してみてください:あなたはd.nameによって集約されているので、私はこれだけを示唆してい

HAVING (MAX(b.backup_finish_date) <= DATEADD(day, -2, GETDATE()) OR 
     MAX(b.backup_finish_date) IS NULL 
     ) AND 
     sys.fn_hadr_backup_is_preferred_replica(d.name) = 1 

。通常、のフィルタリングの前に、の方が良いでしょう。しかし、操作が本当に高価な場合は、アグリゲーションの後にをフィルタするほうがよいでしょう。

+0

私は試してみましたが、それは1:32を受け取りました... – carolcastelli

+0

関数は、SQL Serverの組み込み関数です.... –

0

これは、中わたに変換しますので、AND b.user_name = 'tsmadmin'に参加するだけでなく参加

HAVING OR

DISTINCT問題がある可能性があります使用することがあります問題がある可能性があります

SELECT @@SERVERNAME AS ServerName; 
SELECT d.name AS DatabaseName 
    , COALESCE(CAST(MAX(b.backup_finish_date) AS VARCHAR(25)), 'never') AS Details 
FROM master.sys.databases d 
JOIN msdb.dbo.backupset b 
    ON d.name COLLATE SQL_Latin1_General_CP1_CI_AS = b.database_name COLLATE SQL_Latin1_General_CP1_CI_AS 
AND b.type = 'I' 
AND b.server_name = SERVERPROPERTY('ServerName') /*Backupset ran on current server */ 
AND b.user_name = 'tsmadmin' 
AND d.database_id <> 2 
AND d.state NOT IN(1, 6, 10)  /* Not currently offline or restoring, like log shipping databases */ 
AND d.is_in_standby = 0   /* Not a log shipping target database */ 
AND d.source_database_id IS NULL /* Excludes database snapshots */ 
AND sys.fn_hadr_backup_is_preferred_replica(d.name) = 1 
GROUP BY d.name 
HAVING isnull(MAX(b.backup_finish_date), DATEADD(dd, -2, GETDATE())) 
     <= DATEADD(dd, -2, GETDATE()); 
関連する問題