Модераторы: LSD

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выполнение запроса, на чьей стороне 
:(
    Опции темы
Диас
Дата 17.6.2008, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Здравствуйте! Остро стоит проблема скорости передачи данных. Сервер (Oracle 8) далеко, связь не летает, таблицы очень большие. Такой вопрос:
по идее любой запрос выполняется на сервере? просто когда я пишу
Код

SELECT 
 field1
  FROM Table1       
where not exists (select field1 from Table2 where field1=table1.field1)

то записи почти сразу начинают появляться. А если хочу узнать количество этих записей
Код

SELECT 
 count(field1)
  FROM Table1       
where not exists (select field1 from Table2 where field1=table1.field1)

то приходится очень долго ждать, как буд-то он сначала все записи грузит ко мне, а уже потом выдает их количество.

Это правильно???
PM MAIL   Вверх
LSD
Дата 17.6.2008, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 18
Всего: 538



Во втором случае на клиента загружается только одна строка, это совершенно точно. Первый случай работает быстрей, потому что Oracle сразу начинает отдавать клиенту данные, не выполнив весь запрос до конца.

Попробуй переписать второй запрос так:
Код

SELECT 
 count(*)
  FROM Table1 t1
where t1.field1 not in (select field1 from Table2)



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Диас
Дата 18.6.2008, 06:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Тоже очень долго! Неужели сервер дак долго производит эту операцию???
PM MAIL   Вверх
DimW
Дата 18.6.2008, 08:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Диас @  18.6.2008,  06:05 Найти цитируемый пост)
Неужели сервер дак долго производит эту операцию

какую именно операцию?! план запроса в студию, а то так гадать можно сколько угодно.
сколько записей в таблицах?
и сколько времени выполняется запрос?
PM MAIL ICQ   Вверх
Диас
Дата 18.6.2008, 08:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



операцию - имеется введу подсчет количества записей, удовлетворяющих условия. Таблицы действительно большие. По несколько сот тысяч записей. и еще вопрос.
Если написать так:

Код

select * from Table1 where rownum between 100000 and 100100
,
то мне реально вышлютсь только 99 записей?
PM MAIL   Вверх
DimW
Дата 18.6.2008, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Диас @  18.6.2008,  08:56 Найти цитируемый пост)
то мне реально вышлютсь только 99 записей?

ну во первых не 99 а 101, т.к. between берет диапозон включительно.
а вовторых нет шансов получить даже одну строку, т.к. присваивание значений псевдостолбцу (rownum) происходит после выполнения from и where. 

Цитата(Диас @  18.6.2008,  08:56 Найти цитируемый пост)
операцию - имеется введу подсчет количества записей, удовлетворяющих условия.

долго или не долго и на какой именно операции тормозит можно будет сказать не раньще чем ты покажещь план запроса.



Это сообщение отредактировал(а) DimW - 18.6.2008, 10:34
PM MAIL ICQ   Вверх
Диас
Дата 18.6.2008, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



DimW, не совсем точно понимаю что значит план запроса, но сам запрос имеется в первом моем сообщении (который с 2ой, с Count). По времени выполняется минут 7. Но тут видишь, сервер далековато стоит и линк медленный. А запрос тот что без Count начинает выдавать записи уже через полминуты.


Цитата(DimW @  18.6.2008,  10:32 Найти цитируемый пост)
а вовторых нет шансов получить даже одну строку, т.к. присваивание значений псевдостолбцу (rownum) происходит после выполнения from и where.


Действительно! Работает только если начало диапазона =1. Если больше, не выдает ничего. А как тогда грузить таблицу по частям??? Мне это надо было для прогресс бара. Может есть более изящный способ отображать ход загрузки таблицы???
PM MAIL   Вверх
DimW
Дата 18.6.2008, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Диас @  18.6.2008,  12:00 Найти цитируемый пост)
А как тогда грузить таблицу по частям??? 

Код

select rn
  from (select rownum rn
          from table1)
 where rn between 1000 and 1100


Цитата(Диас @  18.6.2008,  12:00 Найти цитируемый пост)
не совсем точно понимаю что значит план запроса

смотри тут
PM MAIL ICQ   Вверх
Диас
Дата 18.6.2008, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



SELECT STATEMENT, GOAL = ALL_ROWS            Cost=3    Cardinality=1    Bytes=12
 SORT AGGREGATE                Cardinality=1    Bytes=12
  FILTER                    
   INDEX FAST FULL SCAN    Object owner=MKT    Object name=TM_SAL_MST_IX18    Cost=3    Cardinality=12906    Bytes=154872
   TABLE ACCESS FULL    Object owner=MKT    Object name=M3_KB_INV    Cost=129    Cardinality=1094    Bytes=13128

Добавлено через 51 секунду
Вот план для запроса с count smile
PM MAIL   Вверх
DimW
Дата 18.6.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Диас @  18.6.2008,  13:56 Найти цитируемый пост)
Вот план для запроса с count

ну тогда и зпрос уже дали бы к этому плану, а то по названию объектов в плане (TM_SAL_MST_IX18, M3_KB_INV)  сложно догадаться кто из них table1, а кто table2.
и информацию по индексам дайте для каждой таблицы.
PM MAIL ICQ   Вверх
Диас
Дата 18.6.2008, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



точно! Извиняюсь. Вот запрос:

Код

select count(invoiceno) from tm_sal_mst where not exists (
    select invo_no from m3_kv_inv where invo_no=tm_sal_mst.invoiceno)


про индексы пока к сожалению не знаю как посмотреть :(
PM MAIL   Вверх
DimW
Дата 18.6.2008, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Цитата(Диас @  18.6.2008,  15:14 Найти цитируемый пост)
про индексы пока к сожалению не знаю как посмотреть :( 


Код

select t.index_name
      ,t.index_type
      ,t2.column_name
  from all_indexes     t
      ,all_ind_columns t2
 where t.table_name = 'TM_SAL_MST'
   and t.owner = 'MKT'
   and t2.index_owner = t.owner
   and t2.index_name = t.index_name

PM MAIL ICQ   Вверх
Диас
Дата 19.6.2008, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Результат:

    INDEX_NAME    INDEX_TYPE    COLUMN_NAME
1    EXM_SAL_MST_02    NORMAL    PO_ID
2    EXM_SAL_MST_02    NORMAL    DIV_CODE
3    EXM_SAL_MST_02    NORMAL    COM_CODE
4    PK_SAL_MST    NORMAL    ORDER_NO
5    PK_SAL_MST    NORMAL    COM_CODE
6    PK_SAL_MST    NORMAL    DIV_CODE
7    TM_SAL_MST_IX1    NORMAL    STATUS
8    TM_SAL_MST_IX1    NORMAL    COM_CODE
9    TM_SAL_MST_IX1    NORMAL    DIV_CODE
10    TM_SAL_MST_IX1    NORMAL    INVO_DATE
11    TM_SAL_MST_IX1    NORMAL    WH_CODE
12    TM_SAL_MST_IX10    NORMAL    INVO_DATE
13    TM_SAL_MST_IX10    NORMAL    DIV_CODE
14    TM_SAL_MST_IX10    NORMAL    COM_CODE
15    TM_SAL_MST_IX11    NORMAL    PICK_NO
16    TM_SAL_MST_IX11    NORMAL    DIV_CODE
17    TM_SAL_MST_IX11    NORMAL    COM_CODE
18    TM_SAL_MST_IX13    NORMAL    CREDIT_TO
19    TM_SAL_MST_IX13    NORMAL    STATUS
20    TM_SAL_MST_IX14    NORMAL    DELY_NO
21    TM_SAL_MST_IX14    NORMAL    DIV_CODE
22    TM_SAL_MST_IX14    NORMAL    COM_CODE
23    TM_SAL_MST_IX15    NORMAL    STATUS
24    TM_SAL_MST_IX15    NORMAL    INVO_DATE
25    TM_SAL_MST_IX16    NORMAL    STATUS
26    TM_SAL_MST_IX16    NORMAL    REQ_DATE
27    TM_SAL_MST_IX17    NORMAL    STATUS
28    TM_SAL_MST_IX17    NORMAL    DELY_DATE
29    TM_SAL_MST_IX18    NORMAL    BILL_TO
30    TM_SAL_MST_IX18    NORMAL    INVO_DATE
31    TM_SAL_MST_IX18    NORMAL    INVO_NO
32    TM_SAL_MST_IX19    NORMAL    PICK_DATE
33    TM_SAL_MST_IX2    NORMAL    INVO_NO
34    TM_SAL_MST_IX2    NORMAL    DIV_CODE
35    TM_SAL_MST_IX2    NORMAL    COM_CODE
36    TM_SAL_MST_IX20    NORMAL    REF_REG_CODE
37    TM_SAL_MST_IX21    NORMAL    STATUS
38    TM_SAL_MST_IX21    NORMAL    REQ_DELY_DATE
39    TM_SAL_MST_IX22    NORMAL    IO_NO
40    TM_SAL_MST_IX23    NORMAL    PARENT_ORDER_NO
41    TM_SAL_MST_IX24    NORMAL    GROUP_TO
42    TM_SAL_MST_IX24    NORMAL    INVO_DATE
43    TM_SAL_MST_IX24    NORMAL    ORDER_DATE
44    TM_SAL_MST_IX25    NORMAL    EDI_NO
45    TM_SAL_MST_IX3    NORMAL    CUST_ORDER_NO
46    TM_SAL_MST_IX3    NORMAL    PO_DATE
47    TM_SAL_MST_IX3    NORMAL    ORDER_DATE
48    TM_SAL_MST_IX4    NORMAL    DELY_DATE
49    TM_SAL_MST_IX4    NORMAL    WH_CODE
50    TM_SAL_MST_IX5    NORMAL    INVO_DATE
51    TM_SAL_MST_IX5    NORMAL    INVO_NO
52    TM_SAL_MST_IX5    NORMAL    ORDER_DATE
53    TM_SAL_MST_IX5    NORMAL    CUST_CD
54    TM_SAL_MST_IX5    NORMAL    ORDER_NO
55    TM_SAL_MST_IX5    NORMAL    PICK_NO
56    TM_SAL_MST_IX6    NORMAL    ORDER_DATE
57    TM_SAL_MST_IX6    NORMAL    COM_CODE
58    TM_SAL_MST_IX6    NORMAL    DIV_CODE
59    TM_SAL_MST_IX6    NORMAL    STATUS
60    TM_SAL_MST_IX6    NORMAL    WH_CODE
61    TM_SAL_MST_IX6    NORMAL    CREATE_EMP
62    TM_SAL_MST_IX6    NORMAL    STATE
63    TM_SAL_MST_IX6    NORMAL    SHIP_TO_NAME
64    TM_SAL_MST_IX6    NORMAL    BILL_TO_NAME
65    TM_SAL_MST_IX7    NORMAL    REQ_DATE
66    TM_SAL_MST_IX7    NORMAL    COM_CODE
67    TM_SAL_MST_IX7    NORMAL    DIV_CODE
68    TM_SAL_MST_IX7    NORMAL    STATUS
69    TM_SAL_MST_IX7    NORMAL    WH_CODE
70    TM_SAL_MST_IX8    NORMAL    ARRIVAL_DATE
71    TM_SAL_MST_IX8    NORMAL    COM_CODE
72    TM_SAL_MST_IX8    NORMAL    DIV_CODE
73    TM_SAL_MST_IX8    NORMAL    STATUS
74    TM_SAL_MST_IX8    NORMAL    WH_CODE
75    TM_SAL_MST_IX9    NORMAL    EXPIRE_DATE
76    TM_SAL_MST_IX9    NORMAL    COM_CODE
77    TM_SAL_MST_IX9    NORMAL    DIV_CODE
78    TM_SAL_MST_IX9    NORMAL    STATUS
79    TM_SAL_MST_IX9    NORMAL    WH_CODE
80    TM_SAL_MST_UX01    NORMAL    ORDER_NO
81    TM_SAL_MST_UX01    NORMAL    COM_CODE
82    TM_SAL_MST_UX01    NORMAL    DIV_CODE
83    TM_SAL_MST_UX01    NORMAL    STATUS
84    TM_SAL_MST_UX01    NORMAL    WH_LOCATION
85    TM_SAL_MST_UX01    NORMAL    INVO_DATE

 smile 
PM MAIL   Вверх
Диас
Дата 19.6.2008, 07:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 11.6.2006

Репутация: нет
Всего: нет



Вот еще пример:

Код

SELECT /*+ ordered index(A TM_SAL_MST_IX15) */  /* tune 020611 */
       A.ORDER_NO               ORDER_NO,
       A.BILL_TO                BILL_TO,
       A.CUST_CD                SHIP_TO,
       to_char(to_date(A.INVO_DATE, 'yyyymmdd'), 'YYYY/MM/DD') INVO_DATE,
       B.INVO_NO                INVO_NO,
       D.PRODUCT                PRODUCT,
       B.MODEL                  MODEL,
       NVL(B.PICK_QTY, 0)       SALES_QTY,
       NVL(B.TOT_AMT_LOC,0)                  TOT_AMT,
       NVL(B.TAX_AMT1_LOC,0)                  +
       NVL(B.TAX_AMT2_LOC,0)                  +
       NVL(B.TAX_AMT3_LOC,0)                  +
       NVL(B.TAX_AMT4_LOC,0)                  +
       NVL(B.TAX_AMT5_LOC,0)                  TAX_AMT,
 D.PUR_TYPE PUR_TYPE
            
FROM  TM_SAL_MST A, TM_SAL_DTL B, TM_MODEL D
      
WHERE A.ORDER_NO   = B.ORDER_NO
  AND A.COM_CODE   = B.COM_CODE
  AND A.DIV_CODE   = B.DIV_CODE
  AND A.DIV_CODE   = 'SAR'
  AND A.STATUS     = 'INVO'
  AND B.MODEL      = D.MODEL
  AND B.SUFFIX     = D.SUFFIX
  AND B.COM_CODE   = D.COM_CODE
  AND A.COM_CODE   = 'LGEAK'
  AND ( A.DIV_CODE    IN ('ALL'  ) OR A.DIV_CODE     =    DECODE('ALL' , 'ALL', A.DIV_CODE  , NULL) )
  AND A.INVO_DATE  >= '20080401'         AND A.INVO_DATE  <= '20080618'
 and a.INVO_NO not in (select invoiceno from m3_kb_inv where invoicedate >= '01/04/2008' 
                                        and  invoicedate <= '18/06/2008')


его план:

SELECT STATEMENT, GOAL = RULE                                                                                    Cost=7    Cardinality=1    Bytes=200
 FILTER                    
  NESTED LOOPS                                                                                                            Cost=7    Cardinality=1    Bytes=200
   NESTED LOOPS                                                                                                            Cost=6    Cardinality=1    Bytes=177
    TABLE ACCESS BY INDEX ROWID    Object owner=MKT    Object name=TM_SAL_MST            Cost=3    Cardinality=1    Bytes=49
     INDEX RANGE SCAN                    Object owner=MKT    Object name=TM_SAL_MST_IX15    Cost=2    Cardinality=1    
    TABLE ACCESS BY INDEX ROWID    Object owner=MKT    Object name=TM_SAL_DTL            Cost=3    Cardinality=1    Bytes=128
     INDEX RANGE SCAN                    Object owner=MKT    Object name=TM_SAL_DTL_PK    Cost=2    Cardinality=1    
   TABLE ACCESS BY INDEX ROWID    Object owner=MKT    Object name=TM_MODEL                    Cost=1    Cardinality=20    Bytes=460
    INDEX UNIQUE SCAN                    Object owner=MKT    Object name=PK_MODEL                                Cardinality=20    
  TABLE ACCESS FULL                    Object owner=MKT    Object name=M3_KB_INV            Cost=129    Cardinality=1    Bytes=21

индексы вывести по всем участвующим таблицам?

Запрос выводит 0 строк за примерно 150 секунд. А если сократить в запросе диапазон дат до одного дня, то те же 0 строк выдает за 2 секунды.
Неужели сервер (довольно мощный) выполняет запрос около 2х минут??? или что-то обрабатывается у меня - на клиентской стороне?

PM MAIL   Вверх
DimW
Дата 19.6.2008, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1330
Регистрация: 24.2.2005
Где: Орёл

Репутация: 23
Всего: 44



Диас, что ты прыгаешь от темы к теме так мы ничего не выясним... 

Цитата(Диас @  19.6.2008,  07:36 Найти цитируемый пост)
или что-то обрабатывается у меня - на клиентской стороне?

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

Цитата(Диас @  19.6.2008,  07:36 Найти цитируемый пост)
Вот еще пример:

а авторы не индусы случайно, уж очень похоже на их подчерк...

возвращаясь к запросу:
Код

select count(invoiceno)
  from tm_sal_mst
 where not exists (select invo_no
          from m3_kv_inv
         where invo_no = tm_sal_mst.invoiceno)


могу предложить пересмотреть решение на такое:
Код

select /*+ use_hash(t) */
       count(*) 
  from tm_sal_mst t, m3_kv_inv t2
 where t2.invo_no(+) = t.invoiceno -- делаем не обязательную связь к таблице m3_kv_inv
   and t2.invo_no is null -- и берем те для которых связи нет 

мог перепутать названия полей при связке - t2.invo_no(+) = t.invoiceno.

PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Oracle"
Zloxa
LSD

Данный раздел предназначен для обсуждения проблем с Oracle Database, другие продукты Oracle здесь не обсуждаются. Просьба при создании темы, придерживаться следующих правил:

  • при создании темы давайте ей осмысленное название, описывающее суть проблемы
  • указывайте используемую версию базы, способ соединения и язык программирования
  • при ошибках обязательно приводите код ошибки и сообщение сервера
  • приводите код в котором возникла ошибка, по возможности дайте тестовый пример демонстрирующий ошибку
  • при вставке кода используйте соответсвующие теги: [code=sql] [/code] для подсветки SQL и PL/SQL кода, [code=java] [/code] - для Java, и т.д.

  • документация по Oracle: 9i, 10g, 11g
  • книги по Oracle можно поискать здесь
  • действия модераторов можно обсудить здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, LSD.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Oracle | Следующая тема »


 




[ Время генерации скрипта: 0.1400 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.