В моем SQL-выражении я дважды вызываю сумму для одного и того же аргумента, дублирует ли это усилие?

Следующее решение:

  • позволяет заменять переменные, которые определены
  • оставляет неизмененные переменные заполнителями, которые не определены. Это особенно полезно при автоматическом развертывании.
  • поддерживает замену переменных в следующих форматах: ${var_NAME} $var_NAME
  • сообщает, какие переменные не определены в среде и возвращает код ошибки для таких случаев


    TARGET_FILE=someFile.txt;
    ERR_CNT=0;

    for VARNAME in $(grep -P -o -e '\$[\{]?(\w+)*[\}]?' ${TARGET_FILE} | sort -u); do     
      VAR_VALUE=${!VARNAME};
      VARNAME2=$(echo $VARNAME| sed -e 's|^\${||g' -e 's|}$||g' -e 's|^\$||g' );
      VAR_VALUE2=${!VARNAME2};

      if [ "xxx" = "xxx$VAR_VALUE2" ]; then
         echo "$VARNAME is undefined ";
         ERR_CNT=$((ERR_CNT+1));
      else
         echo "replacing $VARNAME with $VAR_VALUE2" ;
         sed -i "s|$VARNAME|$VAR_VALUE2|g" ${TARGET_FILE}; 
      fi      
    done

    if [ ${ERR_CNT} -gt 0 ]; then
        echo "Found $ERR_CNT undefined environment variables";
        exit 1 
    fi
11
задан fishhead 12 February 2010 в 17:32
поделиться

1 ответ

Нет, SQL Server повторно использует агрегаты.

Фактически, если вы построите план запроса, вы увидите SUM в наборе результатов оператора агрегирования (например, Stream Aggregate ), обозначенного как что-то вроде Выражение **** .

Значение этого выражения позже будет использоваться в качестве входных данных для других операторов.

Вот пример запроса:

SELECT  ROUND(SUM(id), -1)
FROM    master
GROUP BY
        name
ORDER BY
        SUM(id) DESC

и его план:

  |--Compute Scalar(DEFINE:([Expr1004]=round([Expr1003],(-1))))
       |--Sort(ORDER BY:([Expr1003] DESC))
            |--Stream Aggregate(GROUP BY:([test].[dbo].[master].[name]) DEFINE:([Expr1003]=SUM([test].[dbo].[master].[id])))
                 |--Index Scan(OBJECT:([test].[dbo].[master].[ix_name_desc]), ORDERED BACKWARD)

Как видите, агрегирование выполняется один раз и сохраняется в Expr1003 .

Expr1003 затем повторно используется в операторе Sort (который обрабатывает ORDER BY ) и Compute Scalar (который обрабатывает ROUND )

15
ответ дан 3 December 2019 в 08:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: