2012-10-17 77 views
1

閱讀this interesting article關於中間實現 - 我還有一些問題。SQL Server和中間實現?

我有這個疑問:

SELECT * 
FROM ... 
WHERE  isnumeric(MyCol)=1 and (CAST(MyCol AS int)>1) 

但是,where子句順序不確定性

所以我威力 GET例外這裏。(如果他第一次嘗試投"k1k1"

我認爲這將解決這個問題

SELECT MyCol 
FROM 
    (SELECT TOP 100 PERCENT foo From MyTable WHERE ISNUMERIC (MyCol) > 1 ORDER BY MyCol) bar 
WHERE 
    CAST(MyCol AS int) > 100 
  • 爲什麼把top 100 + order將VS改變我定期查詢?

我評價讀:

(「中間」的結果 - 換句話說,在 的方法獲得的結果,將被用於計算最終結果)將是 在TempDB中物理存儲(「物化」)並從那裏用於 用戶的其餘部分,而不是從基表 查詢回來。

  • 什麼區別呢使得如果它被存儲在tempdb數據庫或查詢基表回來?這是相同的數據

回答

3

支持的方式,以避免由於優化重組的事情的錯誤是使用CASE

SELECT * 
FROM YourTable 
WHERE 
    1 <= 
    CASE 
     WHEN aa NOT LIKE '%[^0-9]%' 
     THEN CONVERT(int, aa) 
     ELSE 0 
    END; 

中級物化是不支持的技術,所以應該只在特殊情況下非常專業用戶使用風險被理解和接受。

TOP 100 PERCENT一般是SQL Server 2005以後的ignored by the optimizer

1

通過在內部查詢中添加TOP子句,迫使SQL Server在運行外部查詢之前首先運行該查詢 - 從而放棄ISNUMERIC返回false的所有行。

如果沒有TOP子句,優化器可以將查詢重寫爲與第一個查詢相同。

相關問題