Есть ли эффективный SQL для запроса части большой таблицы - PullRequest
0 голосов
/ 07 февраля 2009

Типичный способ выбора данных:

select * from my_table

Но что, если таблица содержит 10 миллионов записей и вам нужны только записи от 300 010 до 300 020

Есть ли способ создать оператор SQL в Microsoft SQL, который получает только 10 записей одновременно?

например.

select * from my_table from records 300,010 to 300,020

Это было бы намного эффективнее, чем извлекать 10 миллионов записей по сети, сохранять их на сервере IIS и затем считать нужные записи.

Ответы [ 6 ]

3 голосов
/ 07 февраля 2009

SELECT * FROM my_table - это лишь верхушка айсберга. Предполагая, что вы говорите о таблице с полем идентификации для первичного ключа, вы можете просто сказать:

SELECT * FROM my_table WHERE ID >= 300010 AND ID <= 300020

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

1 голос
/ 05 сентября 2012

Я использую запросы-обертки, чтобы выбрать основной запрос, а затем просто изолировать числа ROW, которые я хочу взять из запроса - это позволяет серверу SQL выполнять всю тяжелую работу внутри запроса CORE и просто выдавать небольшое количество таблицы, которую я запросил. Все, что вам нужно сделать, это передать [start_row_variable] и [end_row_variable] в SQL-запрос.

ПРИМЕЧАНИЕ. Предложение order указано ВНЕ основного запроса [sql_order_clause]

w1 и w2 - это временная таблица, созданная сервером SQL в качестве таблиц-оболочек.

SELECT
    w1.*
FROM(   
    SELECT w2.*, 
    ROW_NUMBER() OVER ([sql_order_clause]) AS ROW
    FROM (

        <!--- CORE QUERY START --->
        SELECT [columns]
        FROM [table_name]
        WHERE [sql_string]
        <!--- CORE QUERY END --->

   ) AS w2
) AS w1
WHERE ROW BETWEEN [start_row_variable] AND [end_row_variable]

Этот метод чрезвычайно оптимизировал мои системы баз данных. Работает очень хорошо.

ВАЖНО! Обязательно всегда явно указывайте только те столбцы, которые вы хотите получить в базовом запросе, поскольку выборка ненужных данных в этих запросах CORE может стоить вам серьезных накладных расходов

1 голос
/ 07 февраля 2009

При работе с большими таблицами часто рекомендуется использовать методы разделения, доступные в SQL Server.

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

Чтобы выбрать конкретный раздел, вы должны использовать запрос, подобный следующему.

SELECT <Column Name1>…/* 
FROM <Table Name> 
WHERE $PARTITION.<Partition Function Name>(<Column Name>) = <Partition Number>

Взгляните на следующий технический документ для получения более подробной информации о секционировании в SQL Server 2005.

http://msdn.microsoft.com/en-us/library/ms345146.aspx

Я надеюсь, что это поможет, но не стесняйтесь задавать дополнительные вопросы.

Приветствия, Джон

1 голос
/ 07 февраля 2009

Попробуйте посмотреть информацию о нумерации страниц. Вот краткое описание этого для SQL Server: http://www.singingeels.com/Articles/Pagination_In_SQL_Server_2005.aspx.

1 голос
/ 07 февраля 2009

Абсолютно. В MySQL и PostgreSQL (две базы данных, которые я использовал) синтаксис был бы

SELECT [columns] FROM table LIMIT 10 OFFSET 300010;

В MS SQL это что-то вроде SELECT TOP 10 ...; Я не знаю синтаксис для смещения списка записей.

Обратите внимание, что вы никогда не хотите использовать SELECT *; это кошмар обслуживания, если что-нибудь когда-нибудь изменится. Этот запрос, однако, будет невероятно медленным, поскольку вашей базе данных придется сканировать и отбрасывать первые 300 010 записей, чтобы добраться до 10, которые вы хотите. Это также будет непредсказуемо, поскольку вы не указали базе данных, в каком порядке вы хотите получить записи.

Это ядро ​​SQL: скажите ему, какие 10 записей вам нужны, идентифицированные ключом в определенном диапазоне, и база данных сделает все возможное, чтобы захватить и вернуть эти записи с минимальной работой. Посмотрите любой учебник по SQL для получения дополнительной информации о том, как он работает.

0 голосов
/ 07 февраля 2009

Используйте TOP, чтобы выбрать только ограниченное количество строк, таких как:

ВЫБРАТЬ ТОП 10 * ИЗ my_table WHERE ID> = 300010

Добавьте ORDER BY, если хотите получить результаты в определенном порядке.

Чтобы быть эффективным, в столбце идентификатора должен быть индекс.

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