ПРЕДПОСЫЛКА: код приложения нельзя изменить. Условия очень специфичны. Я ищу что-то нестандартное, последнее средство, если позволите.
У меня есть табличная функция (встроенная), которая создает от 2 до 7 записей. Иногда их может быть только 1 или до 15 (но редко).
Функция используется приложением только таким образом, без ORDER BY.
select * from dbo.myfunction(...)
Есть ли какой-либо способ, по вашему опыту, гарантировать (насколько вы когда-либо наблюдали при использовании определенного метода), что результаты возвращаются в порядке второго столбца? Столбцы: varchar(3), datetime, varchar(50). Не заставляйте меня начинать с select *, это НАМЕРЕННО, так что внешний интерфейс будет отображать столько столбцов, сколько я заставлю отображать функцию в будущем.
Исходя из опыта, с одним индексом (кластеризованным PK) для обхода данных любая текущая версия SQL Server и уровень SP должны всегда выполнять простое INDEX SCAN для ‹20 записей без параллелизма, что дает мне упорядоченные результаты в приложении. выберите.
Твои мысли? Я бы предпочел оставить теорию вне обсуждения. Если вы можете придерживаться практического опыта и вести проповеди о лучших практиках дома, я также был бы вам признателен.
ОБНОВЛЕНО Вот как это выглядит сейчас
create function dbo.myfunction(....)
returns @RES table
(
[#] int identity primary key clustered,
[Varchar3Col] varchar(3),
[DateTimeCol] datetime,
[Varchar50Col] varchar(50)
) as
BEGIN
declare @RES2 table
(
rn int,
[Varchar3Col] varchar(3),
[DateTimeCol] datetime,
[Varchar50Col] varchar(50)
)
insert @RES2
select rn=row_number() over (order by action_time),
[Varchar3Col]
[DateTimeCol]
[Varchar50Col]
from (.....)
inner join (.....) ON (.....)
declare @i int
set @i = 0
while @@rowcount > 0 begin
set @i=@i+1
insert @RES
select [Varchar3Col], [DateTimeCol], [Varchar50Col]
from @RES2
where rn=@i
end
return
END
GO
- Если вы посмотрите на приведенное выше, заполнение @RES выполняется последовательно в желаемом порядке вручную.
- @RES имеет кластеризованный ПК, представляющий вставленный порядок.
- столбцы достаточно малы, чтобы 20 строк всегда помещались на одной странице размером 8 КБ.
Будет ли это работать (с простым SELECT на прикладном уровне)?
ORDER BY
к заявке. Так действует гарантия. Это не проповедь о лучших практиках, это просто правда... оптимизатор запросов может упорядочить ваши результаты любым способом, который он считает наиболее эффективным. И да, это может произойти с 20 строками, и это может измениться при изменении статистики в базовых таблицах, накопительном обновлении, пакете обновления, обновлении и т. д. - person Aaron Bertrand   schedule 19.08.2011ORDER BY
. - person Aaron Bertrand   schedule 19.08.2011