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
Предположим, что у меня есть список идентификаторов, которые соответствуют записям человека. Каждый из тех идентификаторов может соответствовать нулю или большему количеству учетных записей пользователей (так как у каждого человека может быть несколько учетных записей).
Для быстрого выбора столбцов из пользовательской таблицы я заполняю временную таблицу с идентификаторами человека, затем внутреннее объединение это с пользовательской таблицей.
Я ищу эффективный способ гарантировать, что порядок результатов в соединении соответствует порядку идентификаторов, поскольку они были вставлены во временную таблицу, так, чтобы список пользователей, это возвращается, был в том же порядке как список человека, как это вводилось.
Я рассмотрел следующие альтернативы:
Я в настоящее время использую опцию 3, и она работает..., но я ненавижу идею использовать порядок пунктом для чего-то, что это уже заказано. Я просто не знаю, сохраняет ли временная таблица порядок, в который были вставлены строки или как соединение работает и что приказывает, чтобы результаты вышли в.
Править:
Принятие я иду с опцией 3, таким образом, СУЩЕСТВУЕТ поле для упорядочивания на..., является там любой формой соединения, которое поможет SQL Server сделать наименьшее количество объема работы в поддержании порядка. Я имею в виду, действительно ли достаточно умно, например, посмотреть на то, какие поля таблицы находятся в порядке пунктом и отделываются от той таблицы сначала при выполнении соединения, так, чтобы порядок набора результатов примерно или полностью совпал с порядком той таблицы, на всякий случай это уже находится в желаемом порядке?
Наборы 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) наборов данных, потому что в большинстве случаев это правда.)