2015-06-30 88 views
0

我需要執行大約20條select語句才能獲取我的應用程序的信息。我將結果集合到一箇中,但我不確定是否有更好的方法來解決這個問題(一種更具性能的方式)。T-SQL多選select語句性能

我下面這個方法:

SELECT TB_A.QTD, 
TB_B.QTD 
FROM 
(
    SELECT COUNT(1) AS QTD 
    FROM TB_A WITH(NOLOCK) 
    WHERE TP = 2 
    AND A = 1 
    AND N = @N 
) TB_A, 
(
    SELECT COUNT(1) QTD 
    FROM TB_B WITH(NOLOCK) 
    WHERE G = @G 
    AND U = @U 
) TB_B, 
...other 18 statements 

PS:喜歡@n,@g一些變量和@u是參數的用戶通知。

+3

只是一個警告,NOLOCK可能會導致你所有奇怪的問題,如讀兩遍同一行或完全跳過一些數據。 –

+2

有點偏離主題,但這裏是一篇討論NOLOCK的文章。人們經常使用它,「因爲它使我的查詢更快」。我從來沒有看到任何可行的證據表明他們更快,但我看到很多證據表明他們產生了相當奇怪的結果。 http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –

+1

我也建議刪除'NOLOCK'。如果你想要更多的速度,那麼你需要創建適當的索引。這可以顯着提高查詢的速度。 Besindes認爲,通常不需要「幫助」優化器。 –

回答

4

您的疑問很好(我會使用明確的CROSS JOIN而不是,,因爲我在FROM子句中憎恨逗號)。

對於性能,兩個索引將有所幫助:tb_a(TP, A, N)tb_b(G, U)

+0

我不確定你是否明白我的意思。我編輯的問題更清楚。基本上,我想避免20個連接/選擇 –

+1

@ThiagoCustodio如果你有20個表,你不能避免有20個選擇。 –

+0

@ThiagoCustodio。 。 。你的解決方案似乎很好。 –

1

我發現一個巨大的查詢通常對性能不利,並且將其分解爲更易於管理的部分可以提供幫助。在每個表上添加任何覆蓋或過濾的索引,也應該有所幫助。

Declare @AQTD int,@BQTD int 

Select @AQTD=COUNT(1) 
FROM TB_A WITH(NOLOCK) 
WHERE TP = 2 
AND A = 1 
AND N = @N 

Select @BQTD=COUNT(1) 
FROM TB_B WITH(NOLOCK) 
WHERE G = @G 
AND U = @U 

SELECT @AQTD,@BQTD 
+1

*「我發現一個巨大的查詢通常對性能不利」* ==>只有當你做錯了。 –

+0

你的方式更具可讀性,但它更具有表演性? –

+1

@ThiagoCustodio不,性能相同。 –

1

我第二@GordonLinoff。 或者,你可以像這樣寫 - 但性能將是相同的。

SELECT 
(
    SELECT COUNT(1) 
    FROM TB_A WITH(NOLOCK) 
    WHERE TP = 2 
    AND A = 1 
    AND N = @N 
) QTD_A, 
(
    SELECT COUNT(1) QTD 
    FROM TB_B WITH(NOLOCK) 
    WHERE G = @G 
    AND U = @U 
) QTD_B, 
...other 18 statements 

...請注意,有沒有FROM

0

爲了減少執行時間,如果所有查詢都是獨立的,您可以從應用程序並行運行它們,但它會加載更多的服務器。