Сервер SQL Server Rowing Rows Mathet - без «заказа» -- sql поле с участием sql-server поле с участием paging пол Связанный проблема

Sql Server paging rows by offset - without 'ORDER BY'


0
vote

проблема

русский

Производственный стол мой содержит более миллиона записей. Требование требует для поискового запроса для извлечения записей по смещению и предельным параметрам (аналогично предельному пункту MySQL), без сортировки набора результатов, так же, как натуральный заказ строк находятся в таблице-сканирования, поскольку «порядок» генерирует неприемлемую производительность Воздействие, в том числе «Заказ от» пункт, используемый в традиционной технике ROW_NUMBER () OVER (заказ ...).
Может ли любой эксперт предложить решение этой проблемы? Пейджинговые записи без какого-либо упорядочения набора результатов. например.

 <код> Create table RandomRecords(int id, datetime recordDate) ---- select * from RandomRecords 34, '1/1/2009' 123, '8/1/2008' 11, '2/23/2008' 10, '3/2/2008' 4, '2/5/2009' 78, '1/1/2008' 55, '5/2/2008' 6666, '2/12/2009' .... one million rows  ----- paging query with @Offset = 3 and @limit=4 generates 11, '2/23/2008' 10, '3/2/2008' 4, '2/5/2009' 78, '1/1/2008'   
Английский оригинал

A production table of mine contains over a million records. An requirement calls for a paging query to retrieve records by OFFSET and LIMIT parameters(similar to MySql's LIMIT clause), without sorting the result set, just as rows' natural order are in a table-scan, since 'ORDER BY' generates unacceptable performance impact, including 'ORDER BY' clause used in traditional technique of ROW_NUMBER() OVER (ORDER BY ...).
Could any expert offer a solution to this problem? Paging records without any ordering of the result set. e.g.

Create table RandomRecords(int id, datetime recordDate) ---- select * from RandomRecords 34, '1/1/2009' 123, '8/1/2008' 11, '2/23/2008' 10, '3/2/2008' 4, '2/5/2009' 78, '1/1/2008' 55, '5/2/2008' 6666, '2/12/2009' .... one million rows  ----- paging query with @Offset = 3 and @limit=4 generates 11, '2/23/2008' 10, '3/2/2008' 4, '2/5/2009' 78, '1/1/2008' 
</div
        
 
 

Список ответов

3
 
vote
<Р> Это просто означает, как комментарий в дополнение к ответу Ремуса. <Р> ПЕЙДЖИНГ первичный ключ не вызывает SQL Server для сортировки, поскольку первичный ключ хранится в порядке сортировки. Вы можете постранично на первичный ключ без WITH заявления, как:
 <код> SELECT * FROM (     SELECT          ROW_NUMBER() OVER (ORDER BY PrimaryKey) as rn     ,   *     FROM BigTable ) sub  WHERE sub.rn BETWEEN 3 and 7   
<Р> подзапрос все еще требуется, потому что вы не можете использовать ROW_NUMBER () в WHERE оператор.
 

This is just meant as a comment in addition to Remus' answer.

Paging a primary key doesn't cause SQL Server to sort, because the primary key is stored in sort order. You can page on primary key without a WITH statement like:

SELECT * FROM (     SELECT          ROW_NUMBER() OVER (ORDER BY PrimaryKey) as rn     ,   *     FROM BigTable ) sub  WHERE sub.rn BETWEEN 3 and 7 

The subquery is still required, because you can't use ROW_NUMBER() in a WHERE statement.

</div
 
 
2
 
vote
<Р> ORDER BY генерирует только дополнительное воздействие, если оно не может быть решена с помощью индекса. Если вы видите «неприемлемое» влияние это означает, что либо вы не правильно создать свой стол, или вы не правильно спроектировать запрос. <Р> Некоторые нас постоянная ORDER BY выражения <код> SELECT ..., ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM ... . Но это все еще может генерировать сортировочную катушку, если должным образом не разработано. <Р> Итак, чтобы рассмотреть ваш пример:
 <код> CREATE TABLE RandomRecords (recordId int not null primary key, id int); INSERT INTO RandomRecords (id) values (...) WITH PagedRandomRecords (    SELECT id,        ROW_NUMBER() OVER (ORDER BY recordId) as rn       FROM RandomRecords) SELECT id FROM PagedRandomRecords    WHERE rn BETWEEN 3 and 7;   
<Р> Это будет <сильный> не сортировать данные, так как RecordId PK кластерный индекс может поставить строки в нужном порядке.
 

ORDER BY only generates additional impact if it cannot be addressed by an index. If you see 'unacceptable' impact it means that either you did not properly design your table, or you did not properly design the query.

Some us constant ORDER BY expressions SELECT ..., ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM .... But that may still generate a sorting spool if not properly designed.

So to consider your example:

CREATE TABLE RandomRecords (recordId int not null primary key, id int); INSERT INTO RandomRecords (id) values (...) WITH PagedRandomRecords (    SELECT id,        ROW_NUMBER() OVER (ORDER BY recordId) as rn       FROM RandomRecords) SELECT id FROM PagedRandomRecords    WHERE rn BETWEEN 3 and 7; 

This will not sort the data because the recordId PK clustered index can deliver the rows in the needed order.

</div
 
 
 
 
0
 
vote
<Р> Если вы до сих пор не находите столбца для ORDER BY, вы можете сортировать по колонку постоянная вы добавляете только, чтобы получить работу запроса:
 <код> SELECT col1, col2 FROM    (SELECT col1, col2,       ROW_NUMBER() OVER (ORDER BY alias_sort) AS alias_rownum    FROM        (SELECT col1, col2, 0 AS alias_sort       FROM           (SELECT col1, col2          FROM ...))) WHERE alias_rownum >= 12345 AND alias_rownum <= 67890   
<Р> «<сильный> 0 AS alias_sort » обеспечивает постоянную колонку, используемую в ORDER BY в пункте родительского запроса. Top внешний запрос содержит фильтр и избавляется от обоих суррогатной alias_rownum и alias_sort внутренних столбцов.
 

If you still find no column for ORDER BY, you may sort by a constant column you add just to get the query working:

SELECT col1, col2 FROM    (SELECT col1, col2,       ROW_NUMBER() OVER (ORDER BY alias_sort) AS alias_rownum    FROM        (SELECT col1, col2, 0 AS alias_sort       FROM           (SELECT col1, col2          FROM ...))) WHERE alias_rownum >= 12345 AND alias_rownum <= 67890 

"0 AS alias_sort" provides the constant column used in the ORDER BY clause in the parent query. Top outer query provides the filter and gets rid of both surrogate alias_rownum and alias_sort inner columns.

</div
 
 

Связанный проблема

-1  SQL MS Access Создайте псевдоним с использованием умножения столбцов  ( Sql ms access create an alias using multiplication of columns ) 
Здравствуйте, у меня возникли проблемы с новым столбцом «псевдоним» в моем коде SQL, умногая два значения столбца. Вопрос: Составьте запрос, чтобы показ...

2  Условная сумма на основе даты (сверхурочная сумма по контракту)  ( Conditional sum based on date sum overtime by contract ) 
У меня есть стол с <Код> ID (Commonse_id), <код> Name , <код> time_worked , <код> time_to_work , <код> Contract_Start_Date , <код> Date_of_Entry . Эта таблиц...

4  Есть ли способ получить типы / имена неизвестного запроса БД, не выполняя его?  ( Is there a way to get types names of an unknown db query without executing it ) 
У меня есть веб-приложение, в котором пользователи вводят произвольные запросы SQL для последующей пакетной обработки. Мы хотим подтвердить синтаксис запроса,...

3  Выбор таблицы свойств как столбцы  ( Selecting table of properties as columns ) 
У меня есть две таблицы, <код> things и <код> properties : <код> CREATE TABLE things ( id SERIAL PRIMARY KEY ); CREATE TABLE properties ( thing_id INT...

0  Вставка в Oracle последовательно  ( Are insert in oracle sequential ) 
У меня есть стол в Oracle. Я создаю несколько пакетных заданий. Каждая пакетная задача вставила некоторое количество записей в таблице. Я хотел узнать, буду...

0  Как вы используете PHP и SQL для отправки данных таблицы на другую таблицу  ( How do you use php and sql to submit table data to another table ) 
У меня есть таблица полетов, и я использую цикл, чтобы распечатать информацию о рейсах, наряду с кнопкой отправки, кнопка, которая нажала, - это представленны...

0  Значение цитаты в Zend Framework 2  ( Quote value into zend framework 2 ) 
Я работаю над приложением, используя ZF2. В моем приложении я должен вставить много строк в базу данных (около 900). У меня есть таблица модель для этого, п...

1  Почему не будет DB2 позвольте мне иметь столбец в том случае?  ( Why wouldnt db2 let me have a column in where clause ) 
У меня есть удаленная база данных DB2, которую я получаю через ODBC. Когда у меня есть запрос, как <код> SELECT t.foo, t.bar, t.problemcolumn FROM problemta...

1  Как я могу выбрать, используя пересечение стоимости разделенного запятой?  ( How can i select using an intersection of comma separated value ) 
У меня есть столбец, удерживает значения, разделенные запятыми. <код> 1,2,3 4,6,7 2,3,8 12234,5467,232445,232455,11223 с заданными критериями массива (н...

98  Подключение к серверу Microsoft SQL с помощью Python  ( Connecting to microsoft sql server using python ) 
<Р> Я пытаюсь подключиться к SQL через питон для запуска некоторых запросов на некоторых базах данных SQL на сервере Microsoft SQL. Из моих исследований в Инте...

0  Linq 2 SQL Использование содержит [дубликат]  ( Linq 2 sql using contains ) 
<в сторону CLASS = "S-NEWACTS S-WELTIVE__info JS-Post-New Imide MB16« Роль = «Статус»> Этот вопрос уже есть ответы здесь : ...

1  Сумма количества членом  ( Sum of quantities by member ) 
Наличие некоторых проблем в операторе SQL для WordPress. Создан пользовательское поле «Member_Name», который проходит в порядке3 под ключ = Member_Name. Мне н...

18  Функция isnull в db2 sql?  ( Isnull function in db2 sql ) 
Есть ли исполнительное, эквивалентное isnull функции для db2? Представьте себе, что некоторые из наших продуктов являются внутренними, поэтому у них нет име...

0  SQL-запрос слишком долго  ( Sql query taking too long ) 
У меня есть простая «вставка в ..». Запрос, который принимает около 40 секунд для выполнения. Он просто принимает записи из одной таблицы и вставляет в другую...

0  SQL Server - получить столбец, у которого есть конкретное значение  ( Sql server get column who have specific value ) 
У меня есть запрос SQL, который возвращает: <код> id | value 1 a 1 a 1 b 2 a 2 a Я хочу получить только...