Как ускорить запрос в sql с более чем 20 миллионами строк

У меня есть таблица с более чем 20 миллионами строк в SQL. Данные сохраняются из нескольких мест в этой таблице. Мне нужно выполнить запрос по дате. Я не могу использовать никакие фильтры, так как мне нужно демонстрировать правильное расположение данных. Обработка данных из одной таблицы занимает более 30 минут. Как мне с этим справиться? Я тоже пробовал индексировать, но это не имеет никакого значения

--  declare @DateTo as DateTime ='2018-08-01';

select distinct 
     [Location Code]
    ,[Bin Code]
    ,[Item No_]
    ,[Quantity]
    ,[Qty_ (Base)]
    ,[Zone Code]
    ,[Bin Type Code]
    ,[Lot No_]
    ,[Registering Date]
from 
    [Warehouse Entry]  
where  
    [Registering Date] <= @DateTo;

это полный запрос? У вас есть ILE в пункте WHERE, и я вообще не вижу этого в FROM

Squirrel 08.08.2018 07:21

Лучше задать этот вопрос на dba.stackexchange.com, чем здесь.

rsjaffe 08.08.2018 07:32

Вы можете разделить свою таблицу по полю [Registering Date], хотя это проще сделать до того, как там будут данные, даже создать индекс по этому полю, чтобы ускорить ваш запрос. Кроме того, вы не можете сделать слишком много, чтобы улучшить этот простой запрос. Это, опуская то, что сказал @Squirrel, что полностью верно, что используемый вами псевдоним ILE не присутствует нигде в вашем запросе

Jaime Drq 08.08.2018 07:40

У вас есть индекс по ILE.[Registering Date], так как это ваш единственный фильтр? Сколько строк возвращает этот запрос?

Livius 08.08.2018 08:10

@ Белка Я редактировал.

Gaurav Maggoo 08.08.2018 08:10

@Livius Да, я вставил все эти столбцы в индекс. Он возвращает более 2 крор строк

Gaurav Maggoo 08.08.2018 08:11

Раньше был ILE.[Registering Date]=, но с <= я не вижу способа улучшить это, так как предполагаю, что у вас больше всего данных <= '2018-08-01'

Livius 08.08.2018 08:12

подскажите, что значит It returns more than 2 crore rows?

Livius 08.08.2018 08:44

Похоже на XY проблема. Вам действительно нужны все эти 20 миллионов строк? Или вы могли бы собрать его для своих целей? И разве что-то вроде where cast([Registering Date] as DATE) between @DateFrom and @DateTo не уменьшит его больше до того, что вам действительно нужно? Кроме того, [Registering Date] - это ДАТА или ВРЕМЯ?

LukStorms 08.08.2018 09:38

@Livius Это индийское слово, обозначающее 20 миллионов. Гаурав Магго: пожалуйста, не используйте здесь неанглийские слова.

James Z 08.08.2018 18:49

@ Ливиус Прошу прощения, сэр.

Gaurav Maggoo 09.08.2018 11:45
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
11
1 273
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Основная проблема, я думаю, это 20 000 000 записей, возвращаемых с сервера. Его время затратно. Особенно, если вы запрашиваете «большие» типы данных (xml, двоичные и т. д.), И ваш сервер удален с медленным интернет-соединением.

Незначительная проблема ОТЛИЧИТЕЛЬНАЯ. Вы выполняете это для всех записей, которые должны быть возвращены во внешний интерфейс.

НИКОГДА не возвращайте весь набор данных во внешний интерфейс. Вместо этого используйте PAGING.

Вот как это сделать:

--  declare @DateTo as DateTime ='2018-08-01';
--  declare @page_size int = 25;
--  declare @page int = 1;

;with [data] as (
    select distinct 
         [Location Code]
        ,[Bin Code]
        ,[Item No_]
        ,[Quantity]
        ,[Qty_ (Base)]
        ,[Zone Code]
        ,[Bin Type Code]
        ,[Lot No_]
        ,[Registering Date]
    from 
        [Warehouse Entry]  
    where  
        [Registering Date] <= @DateTo
)
select
     [Location Code]
    ,[Bin Code]
    ,[Item No_]
    ,[Quantity]
    ,[Qty_ (Base)]
    ,[Zone Code]
    ,[Bin Type Code]
    ,[Lot No_]
    ,[Registering Date]
from 
    [data]   
order by     
    [Registering Date] asc
offset 
    @page_size * (@page - 1) rows fetch next @page_size rows only;

Масштаб зафиксирован, крор составляет 10 миллионов.

James Z 08.08.2018 18:51

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

I cannot use any filters as I have to showcase data location wise.

Эта линия нечеткая, ее важно понимать.

Для 2-х крор рядов distinct имеет значение серьезно.

Удалить Distinct.

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

Согласно вашему видимому запросу,

Создать некластеризованный индекс в дату регистрации

Create non clustered index ix_Test on [Warehouse Entry]([Registering Date])include( [Location Code]
    ,[Bin Code]
    ,[Item No_]
    ,[Quantity]
    ,[Qty_ (Base)]
    ,[Zone Code]
    ,[Bin Type Code]
    ,[Lot No_]
)

Другие вопросы по теме