簡體   English   中英

如何強制SQL Server以特定順序執行查詢

[英]How do I force SQL Server to execute a query in a particular order

我有以下查詢

DECLARE @userId INT  
DECLARE @siteId INT

SET @siteId = -1  
SET @userId = 1828  

SELECT  a.id AS alertId,  
        a.location_id,  
        a.alert_type_id,  
        a.event_id,  
        a.user_id,  
        a.site_id,  
        a.accepted_by  
FROM    alerts AS a    
JOIN    alert_types AS ats ON a.alert_type_id = ats.id 
JOIN    events AS tr ON a.event_id = tr.event_id 
WHERE   tr.end_Time IS null
AND     tr.status_id = 0
AND     ats.code = 'E'
AND     a.site_id in (SELECT * FROM dbo.udf_get_event_sitelist(@siteId, @userId))

此查詢運行需要5到17秒,但在許多情況下,函數dbo.udf_get_event_sitelist(@ siteId,@ userId)不返回任何行,因此查詢將找不到任何數據。

如何強制SQL Server首先執行用戶定義的函數。 我感謝我可以將查詢重寫為存儲過程並首先執行子選擇,但是如果可能的話,我想在單個SQL語句中執行此操作。

使“FROM”表成為函數的結果集,並將其他表連接到它

DECLARE @userId INT  
DECLARE @siteId INT

SET @siteId = -1  
SET @userId = 1828  

SELECT  a.id AS alertId,  
        a.location_id,  
        a.alert_type_id,  
        a.event_id,  
        a.user_id,  
        a.site_id,  
        a.accepted_by  
FROM    (SELECT * FROM dbo.udf_get_event_sitelist(@siteId, @userId)) dt
JOIN    alerts AS a ON dt.site_id=a.site_id
JOIN    alert_types AS ats ON a.alert_type_id = ats.id 
JOIN    events AS tr ON a.event_id = tr.event_id 
WHERE   tr.end_Time IS null
AND     tr.status_id = 0
AND     ats.code = 'E'

你可以將udf_get_event_sitelist的結果選擇到一個表變量中,如果@@ rowcount> 0,只能繼續查詢大查詢

使用內聯函數時遇到的問題是可以為SELECT中返回的每一行重新計算它們。 這意味着,如果SELECT語句返回100行,則該函數可以執行100次。

您應該遵循Sambo99的建議並將其提取到表變量(如果您認為它需要索引,則將其提取到臨時表)。

此外,修改您的UDF只返回site_ID,因為我猜你沒有neet所有(*)列

SELECT * FROM dbo.udf_get_event_sitelist(@siteId, @userId)

SELECT site_id FROM dbo.udf_get_event_sitelist(@siteId, @userId)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM