Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных по не индексированной колонке / 14 сообщений из 14, страница 1 из 1
15.11.2016, 13:48
    #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
15.11.2016, 13:58
    #39347535
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по не индексированной колонке
amireyevКак ускорить выборку данных из большой таблице по не индексированной колонке?Продать душу дьяволу?
...
Рейтинг: 0 / 0
15.11.2016, 14:12
    #39347558
amireyev
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по не индексированной колонке
Elic,

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

CREATE MATERIALIZED VIEW TES
AS
SELECT * FROM DUAL

[Error] ORA-01031: insufficient privileges
(1: 0): ORA-01031: insufficient privileges
...
Рейтинг: 0 / 0
15.11.2016, 19:08
    #39347854
Выборка данных по не индексированной колонке
amireyev Таблицу создаю под другим пользователем. А индекс можно тоже под другим создать :)
...
Рейтинг: 0 / 0
24.11.2016, 15:36
    #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
24.11.2016, 15:42
    #39353807
Оракул!
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по не индексированной колонке
pamibol,

авторМы используем данный подход когда уже индексы и result cash не помогают.
Т.е. вы считаете, что ваши алгоритмы обработки на PL круче того, что написали разработчики оракл?
...
Рейтинг: 0 / 0
24.11.2016, 15:57
    #39353825
pamibol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по не индексированной колонке
Нет.
Но разработчики нам и дали BULK COLLECT для этих целей.
Я думаю, что если запустить на запрос анализатор через EM то будет предложено создать индекс или новый план создать и запрос будет летать (возможно). Но в данной ситуации сделать этого нет возможности по этому приходится писать такой код.
...
Рейтинг: 0 / 0
24.11.2016, 16:30
    #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
24.11.2016, 17:44
    #39353957
SY
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
24.11.2016, 18:33
    #39354016
pamibol
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка данных по не индексированной колонке
Господа вы все говорите очень дельные вещи.
Особенно мне понравилось предложение переезда на extadata с учетом того, что у человека нет прав создавать индексы в продакшен схеме.
И почему вы обращаете внимание только на count(1) предполагается, что других вычислений производиться не будет.

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

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

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

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

ТС надо прочитать кусок таблицы с простым фильтром без каких-либо условий "обрывания" выборки.
Твой совет в данном случае полная чепуха.
Рекомендую понять предназначение инструментов до того как давать советы.
...
Рейтинг: 0 / 0
24.11.2016, 20:55
    #39354091
SY
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
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Выборка данных по не индексированной колонке / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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