2012-05-01 6 views
0

Все хотят, чтобы я был более конкретным. Я пытаюсь сделать разбиение на страницы с помощью asp classic и базы данных ms-access. Это запрос, который я использую для получения элементов для страницы 2. Есть 25 элементов на страницу, и когда запрос возвращает более крупные наборы данных, например, около 500+, это занимает около 20 секунд, и да, я сделал sku индексированный для более быстрые запросы. какие-либо предложения.Как сделать этот код SQL быстрее?

SELECT TOP 25 * 
FROM catalog 
WHERE sku LIKE '1W%' 
AND sku NOT IN (SELECT TOP 25 sku 
       FROM catalog 
       WHERE sku LIKE '1W%' ORDER BY price DESC) ORDER BY price DESC 
+2

Что СУБД вы используете? – srgerg

+1

'TOP' без' ORDER BY' довольно странно. –

+0

TOP подразумевает (скорее всего) SQL-сервер или MS-Access. Который из них? –

ответ

1

Некоторые указатели:

  • Вы можете имитировать SELECT BOTTOM (n) с помощью TOP (n) и реверсирования ORDER BY
  • Вы можете использовать вложенные ВЫБИРАЕТ (создание временной таблицы)

Таким образом, окончательный результат запроса «подкачки» (заменить 50 на 75, 100, 125, ...для последующих страниц):

SELECT TOP 25 * 
FROM 
(
SELECT TOP 50 * 
FROM catalog 
WHERE sku LIKE '1W%' 
ORDER BY price desc 
) 
TEMP 
ORDER BY price asc; 

Хотя вы упомянули вы индексируетесь ваши данные, но, просто чтобы быть совершенно ясно, для достижения оптимальной производительности, вы должны убедиться, что все ваши таблицы надлежащим образом проиндексированы для вашего запроса. В этом случае я бы рекомендовал, МИНИМУМ двух столбцов, участвующих в запросе:

CREATE INDEX IX_CATALOG ON CATALOG (SKU, PRICE); 
0

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

Существует хороший обзор различных синтаксисов на Wikipedia page for the SQL select statement.

К примеру, в MySQL можно использовать LIMIT clause of the SELECT statement, чтобы указать, сколько строк для возврата и смещение:

SELECT * 
FROM catalog 
WHERE sku LIKE '1W%' 
ORDER by id 
LIMIT 25, 9999999999 

, который возвращает строки 26 до 9999999999 результатов запроса.

+0

хотел бы использовать ограничение и смещение, однако это находится в базе данных ms-access – kqlambert

0

Создайте индекс на столбце sku (если действительный сделать его уникальным). Сколько строк в таблице?

2

TOP без ORDER BY выглядит бесполезным или, по крайней мере, странным. Я думаю youo имел в виду использовать этот подзапрос:

(SELECT TOP 25 sku 
    FROM catalog 
    WHERE sku LIKE '1W%' 
    ORDER BY sku 
) 

Добавить индекс по sku, если у вас есть не один.

Возможным переписывание запроса, для доступа:

SELECT * 
FROM catalog 
WHERE sku LIKE '1W%' 
AND sku >= (SELECT MAX(sku) 
      FROM (SELECT TOP 26 sku 
        FROM catalog 
        WHERE sku LIKE '1W%' 
        ORDER BY sku 
       ) 
      ) 

Если вы используете SQL-сервер, вы можете использовать окно функции для этого типа запроса.

0
SELECT sku 
FROM catalog 
WHER sku LIKE '1W% 
ORDER BY __SOME COLUMN __ 
LIMIT 10000 OFFSET 25 

Это возвращает все * строки в базе данных, которые после ряда 25 (OFFSET 25).

* LIMIT 10000 ограничивает полученный запрос до 10000 кортежей (строк).

Чтобы гарантировать, что вы не получаете случайные OFFSET, вам нужно заказывать некоторые колонки.

Смежные вопросы