SQL-запрос, который может выбрать n строк по порядку, а затем вернуть m строк - PullRequest
1 голос
/ 01 февраля 2011

Мне нужно создать SQL-запрос, который может выбирать, скажем, 1000 строк на один столбец, а затем возвращает только 100 строк.

Почему? Мой запрос может выбрать ~ 1 000 000 строк (или больше), и я хочу взять первые 1000, и из этих 1000 строк отображаются только 100 с наилучшей релевантностью. Я боюсь за производительность такого выбора, поэтому я хочу представить этот первый шаг (взять только 1000 строк). Я знаю, что могу пропустить документ с большей релевантностью, но в этом случае это не имеет значения.

Ответы [ 4 ]

5 голосов
/ 01 февраля 2011

Имеет ли значение, если вы не выберете первую 1000?то есть, если вы просто используете ...

Select top 100 *
From table
Order by column

Вы получите тот же результат и, как указано в другом месте, скорее всего, вы не будете ухудшать производительность, а не улучшать ее.

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

4 голосов
/ 01 февраля 2011

Мне кажется, я наконец понял, к чему вы пытаетесь, но, похоже, вы очень озадачены тем, как базы данных выполняют операции упорядочения.

Если я вас правильно понимаю, вас беспокоит влияние на производительность сортировки большого количества строк (в вашем примере 1000, хотя это НЕ большое количество строк). Таким образом, вы пытаетесь перехитрить его, заставляя сортировать только те 100 строк, которые вас интересуют.

Если вы примените предложение where, чтобы ограничить его до 100 строк, в большинстве случаев современная система БД будет автоматически задерживать выполнение сортировки до тех пор, пока не сузит результаты, чтобы избежать дополнительной работы. Это не соответствует действительности в 100% случаев, но когда оптимизатор БД решает выполнить первую сортировку, он обычно имеет ОЧЕНЬ вескую причину в зависимости от производительности или потому, что запрос выявил условие, при котором сортировка должна выполняться в первую очередь для точные результаты.

Хитрость в том, что вы должны понимать, что tSQL - это декларативный язык, а не процедурный. То есть вы используете язык для описания того, что вы хотите, а оптимизатор вычисляет точный алгоритм, чтобы это произошло. Похоже, что вы пытаетесь оптимизировать свой код так, как если бы вы писали процедурный язык, такой как C # или Java. SQL переводит ваш запрос в код, он не запускается при вводе.

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

2 голосов
/ 01 февраля 2011

Буквальное толкование приведет к

select top 1000 from tbl order by columnname

И следующему шагу к

SELECT TOP 100 FROM (select top 1000 from tbl order by columnname) SQ

Но это не отличается от прямого

select top 100 from tbl order by columnname

Если толькоВы после 2 различных заказов

SELECT TOP 100
FROM (
   select top 1000 from tbl
   order by columnname) SQ
ORDER BY othercolumn

или переключения между asc / desc

SELECT TOP 100
FROM (
   select top 1000 from tbl
   order by columnname ASC) SQ
ORDER BY columnname DESC
1 голос
/ 01 февраля 2011

Вы можете использовать подзапрос. Что-то вроде:

select top 100 * from (
    select * from tablename
    limit 1000
)
order by fieldname

Мой SQL немного устарел, поэтому синтаксис может быть немного отключен, и может быть лучший способ сделать это в зависимости от платформы, с которой вы работаете, но, надеюсь, это поможет.

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