SQL/Oracle: когда индексы на нескольких столбцах могут использоваться

___ константа, похоже, имеет ограничение по размеру (хотя это не удалось найти в спецификации).

blockquote>

Ограничения зависят от устройства. Постоянные буферы имеют ограничение размера каждого буфера (CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE, мин. 64 КБ), а также существует ограничение на количество постоянных аргументов, которые можно передать ядру (CL_DEVICE_MAX_CONSTANT_ARGS, мин. 8). Как AMD, так и Nvidia GPU обычно близки к минимумам, поэтому общий объем данных, которые можно передать как __constant, может быть очень небольшим.

Смысл «постоянной» памяти не в том, чтобы передавать вводимые пользовательские данные только для чтения ядрам (как вы, похоже, их используете); Дело в том, чтобы хранить специфичные для алгоритма константы (справочные таблицы, коэффициенты матрицы / полинома / фильтра и т. д.). Если вы хотите передать входные данные только для чтения, обычным способом является объявление аргумента ядра как __global const * и создание соответствующего буфера с CL_MEM_READ_ONLY.

Здесь немного больше понимания.

19
задан avernet 11 September 2008 в 23:09
поделиться

3 ответа

Существует на самом деле три основанных на индексе метода доступа, которые может использовать 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

я чаще всего видел быстрое полное индексное сканирование "в дикой природе", но все возможны.

13
ответ дан 30 November 2019 в 04:29
поделиться

Это не корректно. Всегда лучше всего для предложения тестового сценария, который представляет данные и лично убеждается. Если Вы хотите действительно понять Оптимизатор 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)
8
ответ дан 30 November 2019 в 04:29
поделиться

До версии Oracle 8 индекс никогда не будет использоваться, если первый столбец не будет включен в SQL.

В Oracle 9i функция Skip Scan Index Access была представлена, который позволяет CBO Oracle попытаться использовать индексы, даже когда столбец префикса не доступен.

Хороший обзор того, как сканирование пропуска работает здесь: http://www.quest-pipelines.com/newsletter-v5/1004_C.htm

4
ответ дан 30 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: