Как сохранить порядок строк временной таблицы при внутреннем соединении с другой таблицей? - PullRequest
5 голосов
/ 20 мая 2010

Сохраняет ли SQL Server «объединение» последовательно какой-либо порядок строк (т. Е. Порядок левой или правой таблицы)?

Psuedocode:

create table #p (personid bigint);
foreach (id in personid_list)
    insert into #p (personid) values (id)
select id from users inner join #p on users.personid = #p.id

ПредположимУ меня есть список идентификаторов, которые соответствуют записям человека.Каждый из этих идентификаторов может соответствовать нулю или большему количеству учетных записей пользователей (поскольку у каждого пользователя может быть несколько учетных записей).

Чтобы быстро выбрать столбцы из таблицы пользователей, я заполняю временную таблицу идентификаторами лиц, а затем присоединяюсь к ней.с таблицей пользователей.

Я ищу эффективный способ убедиться, что порядок результатов в объединении соответствует порядку идентификаторов, как они были вставлены в временную таблицу, так что список пользователейвозвращается в том же порядке, что и список лиц, в котором он был введен.

Я рассмотрел следующие варианты:

  1. с использованием "#p inner join users", на случайпорядок левой таблицы сохраняется
  2. с использованием «#p пользователей левого соединения, где id не равен нулю», в случае, если левое соединение сохраняет порядок, а внутреннее объединение
  3. не использует «создать таблицу»(rownum int, personid bigint) ", вставляя увеличивающийся номер строки при заполнении временной таблицы, так что результаты можно упорядочить по rownum в объединении
  4. с использованием SQLСерверный эквивалент предложения "order by order of [tablename]", доступного в DB2

В настоящее время я использую вариант 3, и он работает ... но я ненавижу идею использования order byпункт для чего-то, что уже заказано.Я просто не знаю, сохраняет ли временная таблица порядок, в котором были вставлены строки, или как работает объединение, и в каком порядке получаются результаты.

РЕДАКТИРОВАТЬ:

Предполагается, что я идус опцией 3, поэтому есть поле для заказа ... существует ли какая-либо форма объединения, которая поможет SQL Server выполнять наименьший объем работы по поддержанию порядка.Я имею в виду, достаточно ли он умен, например, чтобы посмотреть, какие поля таблицы расположены в предложении по порядку, и сначала отработать эту таблицу при выполнении объединения, так что порядок набора результатов примерно или полностью совпадает с порядком этой таблицы, простоесли он уже в нужном порядке?

1 Ответ

3 голосов
/ 20 мая 2010

Наборы SQL никогда не упорядочиваются, если вы явно не упорядочиваете их с помощью предложения order by.

Сделайте это:

create table #p (personid bigint);

insert into #p (personid) values (id)
select id from users 
ORDER BY <something like users.name>;

select * from #p 
ORDER BY <something like users.name>;

Обратите внимание, что хотя вы можете вставлять по порядку, это не означает, что последующий выбор будет упорядочен, потому что наборы SQL никогда не упорядочиваются, если вы явно не упорядочите их с помощью предложения order by.

Вы пишете:

Чтобы быстро выбрать столбцы из таблицы пользователей, я заполняю временную таблицу идентификаторами людей, а затем внутренне объединяю ее с таблицей пользователей.

Обратите внимание, что в большинстве случаев быстрее будет просто выбрать непосредственно из users, используя в списке:

select * form users where users.id in (1, 2, 3, 6, 9, ... );

Вы, вероятно, преждевременно "оптимизируете" то, что не нуждается в оптимизации. СУБД (как правило) написаны, чтобы быть эффективными, и, вероятно, будут выполнять небольшую дополнительную работу, сортируя то, что уже отсортировано случайно. Сконцентрируйтесь на функциональности, пока у вас не возникнет необходимость оптимизации. (Я говорю это как человек, который последние несколько месяцев тратил почти исключительно на оптимизацию SQL на очень больших (~ полмиллиарда рядах OLTP) наборах данных, потому что большую часть времени это так.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...