Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何避免在select中反复对列值进行相同的计算?_Sql_Sql Server 2005 - Fatal编程技术网

Sql 如何避免在select中反复对列值进行相同的计算?

Sql 如何避免在select中反复对列值进行相同的计算?,sql,sql-server-2005,Sql,Sql Server 2005,我有时会在表格上写下选择: SELECT a.col1 + b.col2 * c.col4 as calc_col1, a.col1 + b.col2 * c.col4 + xxx as calc_col1_PLUS_MORE FROM .... INNER JOIN ... ON a.col1 + b.col2 * c.col4 < d.some_threshold WHERE a.col1 + b.col2*c.col4 > 0 当计算变得相当复杂,并在

我有时会在表格上写下选择:

SELECT
    a.col1 + b.col2 * c.col4 as calc_col1,
    a.col1 + b.col2 * c.col4 + xxx as calc_col1_PLUS_MORE
FROM ....
INNER JOIN ...
    ON a.col1 + b.col2 * c.col4 < d.some_threshold
WHERE a.col1 + b.col2*c.col4 > 0
当计算变得相当复杂,并在同一个SELECT中使用多达3-5次时,我真的希望在函数或类似函数中重构它,以便:

希望提高性能/利用缓存 当我在后期意识到需要更改计算时,请避免忘记更新4个计算中的一个。 我通常在SPs中选择这些选项


有什么想法吗?

查询优化器应该已经从性能角度优化了重复的评估。但您当然可以使用CTE来提高可读性/可维护性:

WITH CTE AS
(
    SELECT
        a.col1+b.col2*c.col4 as calc_col1,
        a.col1+b.col2*c.col4 + xxx as calc_col1_PLUS_MORE
    FROM ....
)
SELECT ...
FROM CTE c
INNER JOIN ... d
    ON c.calc_col1 < d.some_threshold
WHERE c.calc_col1 > 0

您还可以堆叠许多CTE以在层中构建复杂表达式:

WITH CTE AS
(
    SELECT
        a.col1+b.col2*c.col4 as calc_col1
    FROM ....
),
CTE2 AS (
    SELECT CTE.*
        ,calc_col1 + xxx as calc_col1_PLUS_MORE
    FROM CTE
)
SELECT ...
FROM CTE2 c
INNER JOIN ... d
    ON c.calc_col1 < d.some_threshold
WHERE c.calc_col1 > 0

您还可以持久化计算字段,甚至为其编制索引


如果计算主要在不同的表之间进行,请尝试索引视图。

Ah-太好了!非常感谢,太好了!我真的需要开始更多地使用CTE。到目前为止,我只在递归树结构中使用过它们,但它们在这方面也有很大帮助。我读过关于索引视图的文章——它们真的能显著提高性能吗?什么时候它们不值得额外的分贝-object@Peter:是的,索引视图绝对值得费心!它们可以将您查询视图的性能提高1000倍或更多-这不是开玩笑。折衷与普通索引相同。它们影响插入、删除以及更新和合并。还有一些其他与模式和db选项相关的先决条件。正如马克·奥斯所说,这绝对值得一试。