Порядок сортировки TSQL, основанный на заказе в In Clasuse - PullRequest
1 голос
/ 22 сентября 2011

Сценарий сначала запускает дорогой отсортированный запрос и сохраняет первые 100 000 первичных ключей (Int32) в списке .NET.Затем извлекайте детали по 100 строк за раз из десятка таблиц.Формат подробного запроса:

    select ... from DetailA where PK in (sorted list of 100 PK).  

Проблема в том, что возврат не отсортирован по порядку в предложении in.Нужна деталь для сортировки.Не хочу применять сортировку, которая использовалась для создания 100 000 главных списков, поскольку это дорогая и грязная сортировка.

Моя мысль - загрузить 100 PK в таблицу #tempSort и использовать ее для сортировки.Есть ли лучший подход?

В настоящее время получение детализации по одной строке за раз с использованием SQLDataReader, и это занимает около 2 секунд.Протестировано получение всего сразу с использованием DataSet с несколькими DataTables, и это было медленнее, чем одна строка за раз с использованием SQLDataReader в 3 раза. Эти данные загружаются в объекты, поэтому необходимы расширенные функции DataSet.

Я не хочу сохранять 100 000 основных результатов в #temp, поскольку это большая активная база данных и необходимо перенести нагрузку на клиент.

Попытка параметров табличного значения в соответствии с рекомендациями.
Это правильный синтаксис?

    CREATE TYPE sID100 AS TABLE 
    ( sID INT, sortOrder INT );
    GO

    /* Declare a variable that references the type. */
    DECLARE @sID100 AS sID100;

    /* Add data to the table variable. */
    INSERT INTO @sID100  (sID, sortOrder) 
    values (100, 1), (200,2), (50,3);

    Select * from @sID100;
    select docSVsys.sID, docSVsys.addDate 
    from docSVsys 
    join @sID100 as [sID100] 
    on [sID100].sID = docSVsys.sID 
    order by [sID100].sortOrder
    GO

    Drop TYPE sID100 

Выше не является оптимальным.Я учусь, но в C # можно создать DataTable и передать его в хранимую процедуру, используя параметры Tabel-Value.Именно то, что сказал Мартин в комментарии, но потребовалось некоторое исследование, чтобы я понял его слова.

1 Ответ

1 голос
/ 22 сентября 2011

Порядок PK в предложении IN не имеет значения.
Имеет значение только самый внешний ORDER BY: любой порядок является произвольным, если не указан

select ...
from DetailA
where PK in (sorted list of 100 PK)
ORDER BY PK

От MSDN ЗАКАЗАТЬ

Когда ORDER BY используется в определении представления, встроенной функции, производной таблицы или подзапроса, предложение используется только для определения строк, возвращаемых предложением TOP. Предложение ORDER BY не гарантирует упорядоченные результаты при запросе этих конструкций, если только в запросе не указано ORDER BY.

Изменить, после обратной связи и с учетом идеи Мартина Смита

select ...
from DetailA A
     JOIN
     TVPorTemptable T ON A.PK = T.PK
ORDER BY
  T.OrderByCOlumn
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...