I want to do a basic simple data health check across a bunch of table in my DB to present to my users, so I created this:
SELECT
(SELECT COUNT(*) FROM StagingProducts
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0) AS NumProducts,
(SELECT COUNT(*) FROM StagingCategories
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0) AS NumCategories,
(SELECT COUNT(*) FROM ManufacturerSalesReps
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0) AS NumSalesReps,
(SELECT COUNT(*) FROM Orders
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0) AS NumOrders,
(SELECT COUNT(*) FROM StagingCustomers
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0) AS NumCustomers,
(SELECT COUNT(ItemID) As CategoryItemsCount FROM StagingCategoryItems
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0
AND ItemID NOT IN (SELECT ItemID FROM StagingProducts WHERE
ManufacturerID=@ManufacturerID AND IsDeleted=0)
) AS AbandonedCategoryItemsCount,
(SELECT COUNT(ChildItemID) As ChildCount FROM StagingChildItems
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0
AND ChildItemID NOT IN (SELECT ItemID FROM StagingProducts WHERE
ManufacturerID=@ManufacturerID AND IsDeleted=0)
) AS AbandonedChildCount,
(SELECT COUNT(RelatedItemID) As RelatedCount FROM StagingRelatedItems
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0
AND RelatedItemID NOT IN (SELECT ItemID FROM StagingProducts WHERE
ManufacturerID=@ManufacturerID AND IsDeleted=0)
) AS AbandonedRelatedCount,
(SELECT COUNT(TagID) As RelatedCount FROM StagingTags
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0
AND ItemID NOT IN (SELECT ItemID FROM StagingProducts WHERE
ManufacturerID=@ManufacturerID AND IsDeleted=0)
) AS AbandonedTagCount,
(SELECT COUNT(ItemID) As ModifierItemCount FROM StagingProductModifierLists
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0
AND ItemID NOT IN (SELECT ItemID FROM StagingProducts WHERE
ManufacturerID=@ManufacturerID)
) As AbandonedModifierItemCount,
(SELECT COUNT(*) FROM
(SELECT COUNT(*) AS CNT, CustomerNumber FROM StagingCustomers
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0
GROUP BY CustomerNumber HAVING COUNT(*) > 1
) AS DuplicateCustomerCount
) AS DuplicateCustomerCount,
(SELECT COUNT(*) FROM
(SELECT COUNT(*) AS CNT, ItemID FROM StagingProducts
WHERE ManufacturerID=@ManufacturerID AND IsDeleted=0
GROUP BY ItemID HAVING COUNT(*) > 1
) AS DuplicateItemCount
) AS DuplicateItemCount
This can runs super fast sometimes but at other times is just hangs the server. What is the best way for me to approach getting this data from across several tables into a single query?
Since you are touching so many tables in your database and any of these tables can be used while you are running your query, if it’s not super important to get the absolute latest information from your tables, I would use