2015-12-22 31 views
6

當前我正在使用此查詢,是否有任何替代此查詢的工具會更快。在單個查詢中查找各種表中的全部記錄

SELECT 
    SUM(result1), 
    SUM(result2), 
    SUM(result3) 
FROM (
    (
     SELECT 
      0 as result1,0 as result2,COUNT(*) as result3 
     FROM 
      table1 
    ) 
    UNION 
    (
     SELECT 
      count(*) as result1,0 as result2,0 as result3 
     FROM 
     table2 
    ) 
    UNION 
    (
     SELECT 
      0 as result1,count(*) as result2,0 as result3 
     FROM 
      table3 
    ) 
    ) as allresult 

回答

3

上述查詢的另一種解決方法是如下:

SELECT (SELECT COUNT(1) FROM table2) AS result1, 
     (SELECT COUNT(1) FROM table3) AS result2, 
     (SELECT COUNT(1) FROM table1) AS result3; 
+1

這兩個查詢都會在同一時間執行 –

+0

感謝你的回答,但兩個查詢都需要同一時間 –

1

添加的表名在WHERE clause並執行以下查詢:

SELECT 
    T.Name AS TableName, 
    S.Row_count AS RecordsCount 
FROM 
    sys.dm_db_partition_stats S 
INNER JOIN sys.tables T ON T.object_id = S.object_id 
Where 
    Object_Name(S.Object_Id) IN ('Employees','Country') 
+0

Givinig錯誤:?表「sys.dm_db_partition_stats」不存在 –

+0

@nitishkoundade,上面的查詢將在MS SQL環境中工作,你在使用 –

+0

數據庫的數據庫爲MySQL 5.5 –

1

很簡單的方法來刮鬍子一些性能加載關閉此查詢:

使用UNION ALL而不是UNION的。 UNION ALL將返回重複項,如果有唯一的區別,那麼UNION就會刪除這些重複項,這是以犧牲性能下降爲代價的。換句話說,它執行UNION ALL,然後返回並刪除重複的條目。

應該增加querys性能

+0

一般而言,你是對的。但在這種情況下,只有三行需要檢查重複項。 –

0

(從this answer複製我的評論)

您可以從INFORMATION_SCHEMA得到一個表中的行數如下(但見警告下文):

SELECT table_rows 
FROM information_schema.tables 
WHERE table_schema = DATABASE() 
AND table_name IN ('table1', 'table2', 'table3'); 

但是MySQL documentation注意到這些值是而不是確切的InnoDb表:「對於InnoDB表,行數只是一個粗糙的h估計用於SQL優化。 (如果InnoDB表已分區,則也是如此)。「如果你使用的是MyISAM,這種方法可能已經足夠了。