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

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 пользователи внутреннего объединения", в случае, если порядок левой таблицы сохраняется
  2. использование "#p оставленный пользователей соединения, где идентификатор не является пустым", в случае, если левое соединение сохраняет порядок и внутреннее объединение, не делает
  3. использование "составляет таблицу (rownum интервал, personid bigint)", вставляя номер строки постепенного увеличения, поскольку временная таблица заполняется, таким образом, результаты могут быть заказаны rownum в соединении
  4. использование SQL Server, эквивалентного из "порядка по приказу [имени таблицы]" пункт, доступный в DB2

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

Править:

Принятие я иду с опцией 3, таким образом, СУЩЕСТВУЕТ поле для упорядочивания на..., является там любой формой соединения, которое поможет SQL Server сделать наименьшее количество объема работы в поддержании порядка. Я имею в виду, действительно ли достаточно умно, например, посмотреть на то, какие поля таблицы находятся в порядке пунктом и отделываются от той таблицы сначала при выполнении соединения, так, чтобы порядок набора результатов примерно или полностью совпал с порядком той таблицы, на всякий случай это уже находится в желаемом порядке?

5
задан Triynko 20 May 2010 в 02:37
поделиться

1 ответ

Наборы 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 никогда не упорядочиваются, если вы явно не упорядочиваете их в порядке по пункту .

Вы пишете:

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

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

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

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

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

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