2015-09-04 47 views
0

所以我們有一個模式來保存視圖名稱和系統中使用的各種報告查詢的列。其中一些觀點非常陳舊,寫得不好,但仍能完成工作(如果緩慢)。如果時間超過x,可以在腳本中結束查詢嗎?

無論如何,我正在編寫一個腳本,它使用動態sql來確定報告中每列的不同值的數量。該腳本的每個視圖循環遍歷每列的關鍵部分是以下行:

SET @sql = N'SELECT @val=COUNT(DISTINCT [' + @curColumnName + N']) FROM [' + @curViewName + N']' 
SET @params = N'@val int OUTPUT' 

EXEC sp_executesql @sql, @params, @[email protected] OUTPUT 

這是行之有效的。但是,正如我之前提到的,這些視圖中的一些視圖編寫得很差,一些舊的模式可能會使用更好的索引,因此從列中檢索不同的值需要很長時間,有時需要幾個小時,或者雙數日。

由於這個原因,執行此操作變得不那麼有效,因爲它需要幾個月才能完成每個報告。事情是,我們並不在意真實的截然不同的數值是什麼,而只是知道是否有超過100個不同的值。

所以我的問題是,是否有一些方法來停止查詢一旦不同值的數量超過100,只是返回100,和/或只是取消sp_executesql調用,然後繼續腳本的其餘部分,如果比說5分鐘要花費更多時間?

回答

1

確實沒有辦法做到之前處理數據。只關注查詢,你可以這樣做:

SELECT @val = COUNT(*) 
FROM (SELECT TOP 100 @curColumnNameFROM 
     FROM @curViewName 
     GROUP BY @curColumnName 
    ) t 

這不太可能會對性能產生重大影響。

有時,在這些情況下,你可以這樣做:

SELECT @val = COUNT(DISTINCT @curColumnName) 
FROM (SELECT TOP 10000 @curColumnNameFROM 
     FROM @curViewName 
     GROUP BY @curColumnName 
    ) t 

這樣可以減少數據的大小,這可能是足夠爲了某些目的。

相關問題