2

在阅读了这篇关于中间物化的有趣文章之后——我还有一些问题。

我有这个查询:

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

但是,where 子句的顺序不是确定性的。

所以我可能会在这里遇到异常。(如果他第一次尝试投射"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
  • 为什么 puttop 100 + order会改变我的常规查询?

我在评论中读到:

(“中间”结果 - 换句话说,在此过程中获得的结果,将用于计算最终结果)将物理存储(“物化”)在 TempDB 中,并从那里用于其余用户,而不是从基表中查询回来。

  • 如果它存储在 tempDB 中或从基表中查询回来有什么区别?这是相同的数据
4

2 回答 2

4

避免由于优化器重组而导致错误的受支持方法是使用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 开始,优化器通常会忽略它。

于 2012-10-17T15:12:25.097 回答
1

通过将 TOP 子句添加到内部查询中,您将强制 SQL Server 在运行外部查询之前先运行该查询 - 从而丢弃 ISNUMERIC 返回 false 的所有行。

如果没有 TOP 子句,优化器可以将查询重写为与您的第一个查询相同。

于 2012-10-17T15:04:27.983 回答