Оператор по модулю в SQL на LHS не использует индекс в Sybase
У нас есть сеточная платформа в памяти, которая загружает данные из базы данных, теперь у нас есть 8 узлов, и мы должны равномерно распределить данные между 8 узлами. поэтому мы использовали оператор%, как показано ниже
select * from LargeTable where id % 8 = 1
select * from LargeTable where id % 8 = 2
select * from LargeTable where id % 8 = 3
select * from LargeTable where id % 8 = 4
select * from LargeTable where id % 8 = 5
select * from LargeTable where id % 8 = 6
select * from LargeTable where id % 8 = 7
select * from LargeTable where id % 8 = 8
Но мы наблюдали, что при сканировании таблиц в запросе используется полное сканирование таблиц вместо индексации, и у нас есть данные, которые попадают в миллионы записей, есть ли способ заставить его использовать индексирование для повышения производительности, или любые другие предложения приветствуются.
1 ответ
Он не будет использовать индекс, потому что у вас есть операция над его столбцом.
Если это кластеризованный индекс, вы могли бы вместо этого использовать тест на дальность (но знаете ли вы точки, в которых он приблизительно расщепляется по 8 направлениям - кажется, вы думаете, что по модулю получается равномерное расщепление?) Вы могли бы и для некластеризованного, но это не так довольно быстро читать, потому что для кластеризованных данных все в порядке на уровне листа.
Вы можете добавить материализованный столбец с идентификатором%8 и индексировать его тоже, но это дополнительная работа при вставке данных, потому что это дополнительный индекс. Если это не слишком сложная вставка, вы найдете, что это сработало, и вы можете читать 8 раз параллельно, каждый из которых идет прямо к своим данным.
Возможно, вы могли бы также использовать раздел таблицы, но это не то, о чем я так много знаю; цель состоит в том, чтобы разделить его на диапазоны, и если вы используете bcp, вы можете bcp из раздела.