___ константа, похоже, имеет ограничение по размеру (хотя это не удалось найти в спецификации).
blockquote>Ограничения зависят от устройства. Постоянные буферы имеют ограничение размера каждого буфера (CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, мин. 64 КБ), а также существует ограничение на количество постоянных аргументов, которые можно передать ядру (CL_DEVICE_MAX_CONSTANT_ARGS, мин. 8). Как AMD, так и Nvidia GPU обычно близки к минимумам, поэтому общий объем данных, которые можно передать как __constant, может быть очень небольшим.
Смысл «постоянной» памяти не в том, чтобы передавать вводимые пользовательские данные только для чтения ядрам (как вы, похоже, их используете); Дело в том, чтобы хранить специфичные для алгоритма константы (справочные таблицы, коэффициенты матрицы / полинома / фильтра и т. д.). Если вы хотите передать входные данные только для чтения, обычным способом является объявление аргумента ядра как
__global const
и создание соответствующего буфера с* CL_MEM_READ_ONLY
.Здесь немного больше понимания.
Существует на самом деле три основанных на индексе метода доступа, которые может использовать Oracle, когда предикат помещается в неведущий столбец индекса.
Индексное сканирование пропуска i): http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#PFGRF10105
ii) Быстро полное индексное сканирование: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i52044
iii) Индексное полное сканирование: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/optimops.htm#i82107
я чаще всего видел быстрое полное индексное сканирование "в дикой природе", но все возможны.
Это не корректно. Всегда лучше всего для предложения тестового сценария, который представляет данные и лично убеждается. Если Вы хотите действительно понять Оптимизатор SQL Oracle google Jonathan Lewis, прочитайте его книги, прочитайте его блог, проверьте его веб-сайт, парень удивителен, и он всегда генерирует тестовые сценарии.
create table mytab nologging as (
select mod(rownum, 3) x, rownum y, mod(rownum, 3) z from all_objects, (select 'x' from user_tables where rownum < 4)
);
create index i on mytab (x, y, z);
exec dbms_stats.gather_table_stats(ownname=>'DBADMIN',tabname=>'MYTAB', cascade=>true);
set autot trace exp
select * from mytab where y=5000;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=1 Bytes=10)
1 0 INDEX (SKIP SCAN) OF 'I' (INDEX) (Cost=1 Card=1 Bytes=10)
До версии Oracle 8 индекс никогда не будет использоваться, если первый столбец не будет включен в SQL.
В Oracle 9i функция Skip Scan Index Access была представлена, который позволяет CBO Oracle попытаться использовать индексы, даже когда столбец префикса не доступен.
Хороший обзор того, как сканирование пропуска работает здесь: http://www.quest-pipelines.com/newsletter-v5/1004_C.htm