powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных по не индексированной колонке
14 сообщений из 14, страница 1 из 1
Выборка данных по не индексированной колонке
    #39347515
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день!
Как ускорить выборку данных из большой таблице по не индексированной колонке?

SELECT COUNT (PK) COUNT_VSEGO,
COUNT (CASE WHEN COLUMN_NAME = 'TEST' THEN PK END) COUNT_PO_COLUMN
FROM TABLE

COUNT_VSEGO = 59 000 000
COUNT_PO_COLUMN = 38 000

Индекс создать не можем, база не наша.

Примерный весь запрос выглядит так

WITH TAB
AS (SELECT /*+ materialize*/
PK,
COLUMN_1,
COLUMN_2,
COLUMN_3,
FROM TABLE
WHERE COLUMN_5 = 'TEST'
)

Далее TAB используется в нескольких соединения.

Если создать таблицу
CREATE TAB
AS
SELECT PK,
COLUMN_1,
COLUMN_2,
COLUMN_3,
FROM TABLE
WHERE COLUMN_5 = 'TEST'

, затем использовать его в основном запросе все летает.
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39347535
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
amireyevКак ускорить выборку данных из большой таблице по не индексированной колонке?Продать душу дьяволу?
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39347558
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elic,

))))))
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39347613
amireyevЕсли создать таблицу
CREATE TAB
AS
SELECT ......
, затем использовать его в основном запросе все летает.
matealized view refresh on demand?
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39347621
amireyev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
таблицу можно - индекс нельзя?, - Таблицу создаю под другим пользователем.

CREATE MATERIALIZED VIEW TES
AS
SELECT * FROM DUAL

[Error] ORA-01031: insufficient privileges
(1: 0): ORA-01031: insufficient privileges
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39347854
amireyev Таблицу создаю под другим пользователем. А индекс можно тоже под другим создать :)
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39353797
pamibol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Самая быстрая обработка в там случае будет через BULK COLLСT ваши данные из таблицы будет загружены "как они есть" после чего с курсору можно будет обращаться как угодно.

Мы используем данный подход когда уже индексы и result cash не помогают.

Единственное конечно все вычисление придется писать через алгоритмы и циклы.

MyTABLE - ваша таблица без индексов.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
declare
 type typeTable is table of MyTABLE%rowtype;
 
 varBulkTable typeTable;

begin
      
 select * bulk collect into    varBulkTable from MyTABLE;
 
 
 for i in varBulkTable.FIRST..varBulkTable.LAST loop
  -- здесь уже будет ваша обработка
   dbms_output.put_line(varBulkTable(i).F_I_O);
   
 end loop;

end;
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39353807
Оракул!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pamibol,

авторМы используем данный подход когда уже индексы и result cash не помогают.
Т.е. вы считаете, что ваши алгоритмы обработки на PL круче того, что написали разработчики оракл?
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39353825
pamibol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет.
Но разработчики нам и дали BULK COLLECT для этих целей.
Я думаю, что если запустить на запрос анализатор через EM то будет предложено создать индекс или новый план создать и запрос будет летать (возможно). Но в данной ситуации сделать этого нет возможности по этому приходится писать такой код.
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39353858
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamibolНо разработчики нам и дали BULK COLLECT для этих целей.
Круто.

Сдернуть в PGA 59 000 000 вместо 38 000 и "обработать в цикле" - это, безусловно, гениальная идея.

amireyevCOUNT_VSEGO = 59 000 000
COUNT_PO_COLUMN = 38 000


2ТС: если на таблицу есть не только select, но еще и references - то можно создать индекс по "чужой" таблице и в своей схеме.
Создание мат. представления требует дополнительных привилегий - обсуждайте с dba, тем более что fast refresh потребует создания mview log, а вариация on commit - вообще зверь специфический в плане нагрузки на "чужую" систему.

Если вариант с индексом или mview не проходит - то можете несколько ускорить FTS, увеличив на уровне сессии db_file_multiblock_read_count.
Кроме того, если есть запас по вводу-выводу - то для ускорения FTS можно использовать parallel или даже замахнуться на dbms_parallel_execute, если применимо и не пугают побочные эффекты.

С учетом
amireyevДалее TAB используется в нескольких соединения.
материализация выглядит разумно, но она идет в temporary tablespace - тут имеет смысл уточнить, нет ли конкуренции за TEMP, и если есть показания, то попробовать продавить персональное temporary tablespace на наименее загруженном контроллере.

Далее следуют решения уже архитектурного порядка и обсуждать их абстрактно смысла не имеет.

Закончить обзор вариантов можно рассмотрением переезда на exadata с ее storage indexes - неплохо ускоряет именно ваш сценарий... Правда, smart scan не очень хорошо дружит с компрессией, то то такое...
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39353957
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamibolНет.
Но разработчики нам и дали BULK COLLECT для этих целей.
Я думаю, что если запустить на запрос анализатор через EM то будет предложено создать индекс или новый план создать и запрос будет летать (возможно). Но в данной ситуации сделать этого нет возможности по этому приходится писать такой код.

Гениально . Тебe надо оформить заявку на патент инновационнoгo методa учета товаров где учетчик будет сидеть в кабинете а не на складе и для учета товар будет со склада пересылаться в кабинет учетчика. Ибо это примерно то что ты предлагаешь. И как ты думаешь сколько будет стоить пересылка товара со скада в кaбинет? И какого размера этот кaбинет должен быть (ладно, товар можно присылать частями - bulk collect limit), но нафига ящики (rows) открывать для подсчета ящикoв? COUNT(*) (без индекса) ползет по блокам таблицы и все что он читает в блoке это Row Directory - Row Data COUNT(*) по-барабану.

SY.
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39354016
pamibol
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа вы все говорите очень дельные вещи.
Особенно мне понравилось предложение переезда на extadata с учетом того, что у человека нет прав создавать индексы в продакшен схеме.
И почему вы обращаете внимание только на count(1) предполагается, что других вычислений производиться не будет.

А по поводу авторучета товаров где учетчик будет сидеть в кабинете а не на складе и для учета товар будет со склада пересылаться в кабинет учетчика например в Японии почтовая служба работает так быстро, что многие организации для передачи корреспонденции в соседнее здание пользуются услугами государственной почты и это получается быстрее и удобнее. Но это все разговоры в пользу бедных.

Мы не с потолка вытянули этот метод технология описано на самом сайте Oracle хоть и под 10g для ряда вычислений это работает.
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39354023
Фотография dbms_photoshop
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamibol,

Ты предлагаешь ускорить FULL SCAN вместо него используя
FULL SCAN (select) + запихивание всей информации в PGA (bulk collect) + for loop.

select + bulk collect + for loop таки может иметь смысл использовать если выборку надо оборвать по хитрому условию.
Но опять же в коллекции здесь может не быть необходимости - можно фетчить курсор до наступления события.

ТС надо прочитать кусок таблицы с простым фильтром без каких-либо условий "обрывания" выборки.
Твой совет в данном случае полная чепуха.
Рекомендую понять предназначение инструментов до того как давать советы.
...
Рейтинг: 0 / 0
Выборка данных по не индексированной колонке
    #39354091
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pamibolМы не с потолка вытянули этот метод технология описано на самом сайте Oracle хоть и под 10g для ряда вычислений это работает.

Да, слышал звон... Tы пойми это все для ускорения чтения данных (причем в PL/SQL что изначально делает производительность хуже SQL в 95% случаев), а для подсчета строк данные не нужны в принципе а для подсчета строк по условию данные по конкретным полям нужны на сервере а не на клиенте. Так-что незачем тут сравнивать скорость пeредачи данных когда сама пeредачa данных не нужна в принципе:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
SQL> select  banner
  2    from  v$version
  3  /

BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
PL/SQL Release 12.1.0.2.0 - Production
CORE    12.1.0.2.0      Production
TNS for 64-bit Windows: Version 12.1.0.2.0 - Production
NLSRTL Version 12.1.0.2.0 - Production

Elapsed: 00:00:00.02
SQL> set timing on
SQL> set serveroutput on
SQL> declare
  2      v_cnt number;
  3  begin
  4      select count(*) into v_cnt from DBA_SOURCE,(select * from dual connect by level <= 5);
  5      dbms_output.put_line('COUNT(*) = ' || v_cnt);
  6  end;
  7  /
COUNT(*) = 1775375

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.68
SQL> declare
  2      type typeTable is table of DBA_SOURCE%rowtype;
  3      varBulkTable typeTable;
  4  begin
  5      select d.* bulk collect into    varBulkTable from DBA_SOURCE d,(select * from dual connect by level <= 5);
  6      dbms_output.put_line('COUNT(*) = ' || varBulkTable.COUNT);
  7  end;
  8  /
COUNT(*) = 1775375

PL/SQL procedure successfully completed.

Elapsed: 00:00:03.26
SQL> declare
  2      v_cnt number;
  3  begin
  4      select count(*) into v_cnt from DBA_SOURCE,(select * from dual connect by level <= 10);
  5      dbms_output.put_line('COUNT(*) = ' || v_cnt);
  6  end;
  7  /
COUNT(*) = 3550750

PL/SQL procedure successfully completed.

Elapsed: 00:00:01.87
SQL> declare
  2      type typeTable is table of DBA_SOURCE%rowtype;
  3      varBulkTable typeTable;
  4  begin
  5      select d.* bulk collect into    varBulkTable from DBA_SOURCE d,(select * from dual connect by level <= 10);
  6      dbms_output.put_line('COUNT(*) = ' || varBulkTable.COUNT);
  7  end;
  8  /
declare
*
ERROR at line 1:
ORA-04036: PGA memory used by the instance exceeds PGA_AGGREGATE_LIMIT
ORA-06512: at line 5


Elapsed: 00:00:07.79
SQL> 



SY.
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных по не индексированной колонке
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]