Отождествите таблицу с максимальными строками в Oracle

Я не большой гуру в Activiti, но в качестве простейшего решения могу предложить активировать Async executor и использовать Asynchronous Continuations для решения служебных задач. Это может решить вашу проблему. Поведение Activiti ожидается, потому что до тех пор, пока оно не сохранит состояние в БД, он не может точно сказать, что процесс создан (потому что транзакция может быть откатана из-за ошибки БД, например)

5
задан Preets 24 December 2008 в 07:20
поделиться

6 ответов

Учитывая, что Вы сказали использование Oracle, я просто запрошу метаданные.

select table_name, max(num_rows) from all_tables where table_name in ('A', 'B', 'C');

Просто видел Ваше редактирование. Просто выполненное вышеупомянутое без, куда пункт и это возвратят самую большую таблицу в базе данных. Только проблема может состоять в том, что Вы могли бы получить таблицу SYS$ или что-то. Поочередно, если Вы просто делаете, это для Вашего собственного знания просто делает

select table_name, num_rows from all_tables order by num_rows; 

и Вы будете видеть, каковы самые большие.

12
ответ дан 18 December 2019 в 07:11
поделиться

Таблица в Вашей схеме, которая имеет макс. строки:

with data as 
(
 select table_name,
        to_number(extractvalue(xmltype(
                  dbms_xmlgen.getxml (
                 ' select count(*) c from ' || table_name)),
                  '/ROWSET/ROW/C')) countrows
 from   user_tables
)
select table_name, countrows
from   data 
where  countrows = (select max(countrows)
                    from   data);

dbms_xmlgen.getxml (' выбор....') чрезвычайно гибок.

4
ответ дан 18 December 2019 в 07:11
поделиться

Вот другой метод, вероятно, чтобы быть намного медленнее, чем простое получение ALL_TABLES.NUM_ROWS, но это не зависит от собранной статистики и дает точные, текущие значения - хотя, как текущий зависит от того, сколько времени это берет для выполнения!

-- For running in SQLPlus you need this to see the output.
-- If running in Toad or similar tool, output is enabled by default

    SET SERVEROUTPUT ON SIZE 100000

    DECLARE
      l_rows  INTEGER;
      l_max_rows  INTEGER := 0;
      l_table_name  all_tables.table_name%TYPE := NULL;
    BEGIN
      FOR table_record IN (SELECT table_name FROM all_tables) LOOP

        EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||table_record.table_name
          INTO l_rows;

        IF l_rows > l_max_rows THEN
          l_max_rows := l_rows;
          l_table_name := table_record.table_name;
        END IF;
      END LOOP;

      IF l_table_name IS NULL THEN
        dbms_output.put_line( 'All tables are empty' );
      ELSE
        dbms_output.put_line( 'Table ' || table_record.table_name || 
                              ' has ' || TO_CHAR(l_max_rows) || ' rows'
                            );
      END IF;
    END;
    /
3
ответ дан 18 December 2019 в 07:11
поделиться
select max(select count(*) from A union select count(*) from B...)

должен работать.

править: если Вы хотите что-то динамическое, можно создать строку в МН / SQL с каждым "количеством (*)" подзапрос (например, перечислив имена таблиц от USER_TABLES), и затем выполнить te основной запрос с:

execute immediate 'select max('||subquery||')'
1
ответ дан 18 December 2019 в 07:11
поделиться

Вы могли получить тот же результат с одним тралом данных как так:

SELECT     DISTINCT
           FIRST_VALUE ( t.owner )
             OVER ( ORDER BY t.num_rows DESC NULLS LAST )
                                                 owner,
           FIRST_VALUE ( t.table_name )
             OVER ( ORDER BY t.num_rows DESC NULLS LAST )
                                                 table_name,
           FIRST_VALUE ( t.num_rows )
             OVER ( ORDER BY t.num_rows DESC NULLS LAST )
                                                 num_rows
FROM       all_tables                            t
1
ответ дан 18 December 2019 в 07:11
поделиться

David Aldridge правильно указывает, что запросы all_tables могли дать неправильные результаты из-за пропавших без вести или лишить статистику таблицы новизны. Но существует также проблема с использованием user_segments; Удаленные блоки под меткой паводка все еще считались бы для размера таблицы.

Пример:

SQL>create table t as select * from all_objects

Table created.

SQL>select blocks, bytes from user_segments where segment_name = 'T';

    BLOCKS      BYTES
---------- ----------
       768    6291456

SQL>delete from t

52676 rows deleted.

SQL>commit;

Commit complete.

SQL>select count(*) from t;

  COUNT(*)
----------
         0

SQL>select blocks, bytes from user_segments where segment_name = 'T';

    BLOCKS      BYTES
---------- ----------
       768    6291456

SQL>truncate table t;

Table truncated.

SQL>select blocks, bytes from user_segments where segment_name = 'T';

    BLOCKS      BYTES
---------- ----------
         8      65536
1
ответ дан 18 December 2019 в 07:11
поделиться
Другие вопросы по тегам:

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