СЛУЧАЙ SQL по сравнению с эффективностью СОЕДИНЕНИЯ

Петля for - самый быстрый способ.

Вы можете сделать это с помощью LINQ, но это будет медленнее. И хотя вы сами не пишете цикл, под капотом все еще есть цикл.

  • Для зубчатого массива вы, вероятно, можете сделать что-то вроде arr.SelectMany(x=>x).ToList().
  • На T[,] вы можете просто сделать arr.ToList(), поскольку IEnumerable<T> из T[,] возвращает все элементы в 2D-массиве. Похоже, что 2D-массив реализует только IEnumerable, но не IEnumerable<T>, так что вам нужно вставить Cast<double> как еще один предложенный кодер. Это сделает его еще медленнее из-за бокса.

Единственное, что может сделать код быстрее, чем простой цикл, - это вычислить количество элементов и построить список с правильной емкостью, поэтому его не нужно увеличивать.
Если ваш массив прямоугольный, вы можете получить размер как width*height, с неровными массивами это может быть сложнее.

int width=1000;
int height=3000;
double[,] arr=new double[width,height];
List<double> list=new List<double>(width*height);
int size1=arr.GetLength(1);
int size0=arr.GetLength(0);
for(int i=0;i<size0;i++)
{  
  for(int j=0;j<size1;j++)
    list.Add(arr[i,j]);
}

Теоретически может быть возможно использовать частное отражение и небезопасный код, чтобы сделать его немного быстрее, делая сырую копию памяти. Но я настоятельно советую против этого.

7
задан Bill Karwin 17 June 2009 в 00:05
поделиться

3 ответа

Если вы суммируете все возможные (или большинство) значений поля Subsid_Cde, то CASE будет быстрее, так как он не будет сканировать таблицу несколько раз, поскольку он агрегирует суммы. Если вы ищете только небольшое подмножество возможных полей Subsid_Cde, тогда отдельные выборки / объединения (вместе с индексом на Subsid_Cde) будут работать быстрее.

Вам нужно научиться читать планы выполнения, тогда вы сможете вычислить такие вещи самостоятельно.

Кроме того, в качестве альтернативы вы можете сделать GROUP BY для Subsid_Cde, заключенную в предложение PIVOT (Google для PIVOT MS SQL SERVER 2005)

4
ответ дан 7 December 2019 в 07:50
поделиться

3 - лучший вариант. Его легко читать, его легко изменить позже, и он должен использовать индексы, которые вы определили и ожидаете использовать (тем не менее, проверьте).

- 1 Иногда вам нужно присоединиться к той же таблице. Но это не одна из них, и присоединение каждый раз, когда вам нужно включить новый Subsid_Cde, делает SQL менее читаемым, не получая ничего особенного.

- 2 Таблицы транзакций имеют тенденцию становиться очень большими, поэтому вы НИКОГДА не хотите сканировать вся таблица. Итак, №2 определенно отсутствует, если только коды, которые вы будете использовать в своем запросе, все равно не вернут вам все строки.

2
ответ дан 7 December 2019 в 07:50
поделиться

Используйте это:

SELECT  (
        SELECT  SUM(Trans_Amt)
        FROM    Transactions
        WHERE   Subsid_Cde = 'AA'
        ) AS sum_aa,
        (
        SELECT  SUM(Trans_Amt)
        FROM    Transactions
        WHERE   Subsid_Cde = 'BB'
        ) AS sum_bb

, без внешнего FROM или предложения WHERE .

В SQL Server 2005+ , используйте это:

SELECT  [AA], [BB]
FROM    (
        SELECT  trans_amt, subsid_cde
        FROM    transactions
        ) q
PIVOT   (
        SUM(trans_amt)
        FOR subsid_cde IN (['AA'], ['BB'])
        )
1
ответ дан 7 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

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