У меня есть таблица с более чем 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;
Лучше задать этот вопрос на dba.stackexchange.com, чем здесь.
Вы можете разделить свою таблицу по полю [Registering Date], хотя это проще сделать до того, как там будут данные, даже создать индекс по этому полю, чтобы ускорить ваш запрос. Кроме того, вы не можете сделать слишком много, чтобы улучшить этот простой запрос. Это, опуская то, что сказал @Squirrel, что полностью верно, что используемый вами псевдоним ILE не присутствует нигде в вашем запросе
У вас есть индекс по ILE.[Registering Date], так как это ваш единственный фильтр? Сколько строк возвращает этот запрос?
@ Белка Я редактировал.
@Livius Да, я вставил все эти столбцы в индекс. Он возвращает более 2 крор строк
Раньше был ILE.[Registering Date]=, но с <= я не вижу способа улучшить это, так как предполагаю, что у вас больше всего данных <= '2018-08-01'
подскажите, что значит It returns more than 2 crore rows?
Похоже на XY проблема. Вам действительно нужны все эти 20 миллионов строк? Или вы могли бы собрать его для своих целей? И разве что-то вроде where cast([Registering Date] as DATE) between @DateFrom and @DateTo не уменьшит его больше до того, что вам действительно нужно? Кроме того, [Registering Date] - это ДАТА или ВРЕМЯ?
@Livius Это индийское слово, обозначающее 20 миллионов. Гаурав Магго: пожалуйста, не используйте здесь неанглийские слова.
@ Ливиус Прошу прощения, сэр.


Основная проблема, я думаю, это 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 миллионов.
Прежде всего, вам следует показать точный запрос, особенно точное предложение 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_]
)
это полный запрос? У вас есть
ILEв пунктеWHERE, и я вообще не вижу этого вFROM