После ввода данных в секционированную таблицу, почему num_rows равно 0 в user_tab_partitions?

вы должны использовать

double g=1.0/3;

или

double g=1/3.0;

Целочисленное деление возвращает целое число.

0
задан Tom 14 July 2018 в 02:51
поделиться

3 ответа

NUM_ROWS показывает количество строк на основе последнего анализа, поэтому вы не должны полагаться на него. Я предлагаю запустить подсчет, например.

SELECT COUNT(*) 
FROM your_table PARTITION FOR (DATE '2016-04-01')

или

SELECT COUNT(ROWNUM)
FROM your_table PARTITION FOR (DATE '2016-04-01')
WHERE ROWNUM <= 1

Он должен быть намного быстрее, чем DBMS_STATS.GATHER_TABLE_STATS (если у вас есть какой-либо индекс в этой таблице)

1
ответ дан Wernfried Domscheit 17 August 2018 в 12:36
поделиться
  • 1
    Фактически, данные вступили в указанный раздел успешно, не так ли? – Tom 13 July 2018 в 15:09
  • 2
    Я добавляю свой раздел SQL в тело вопроса, я вставил одну информацию для cycle_mth = 2015-May-31, а затем использовал SELECT COUNT () FROM per_limra PARTITION FOR (DATE '2015-06-01') ; в результате получается 1, что является правильным. но когда я ВЫБРАТЬ СЧЕТ () FROM per_limra PARTITION FOR (DATE '2015-05-01'); результат тоже 1, почему? – Tom 14 July 2018 в 02:55
  • 3
    У нас нет доступа к вашей базе данных, и мы не видим, как определяется ваша таблица. Я предлагаю запустить SELECT * FROM PER_LIMRA, чтобы посмотреть, что на самом деле находится в таблице. – Bob Jarvis 14 July 2018 в 03:46
  • 4
    Что вы считаете? COUNT() не работает. – Wernfried Domscheit 14 July 2018 в 09:27
  • 5
    @BobJarvis. Я проверил данные. результат нормальный. Я могу понять, почему это происходит? – Tom 16 July 2018 в 02:03

Исходя из информации раздела, которую вы добавили в свой вопрос, ответ ясен. Причина, по которой

SELECT COUNT() FROM per_limra PARTITION FOR (DATE '2015-06-01')

и

SELECT COUNT() FROM per_limra PARTITION FOR (DATE '2015-05-01')

возвращает 1, состоит в том, что они оба смотрят на один и тот же раздел. Ваши три раздела:

PARTITION per_limra_p004
  VALUES LESS THAN ( TO_DATE('01-11-2015','DD-MM-YYYY'), i.e. less than 01-Nov-2015

PARTITION per_limra_p003
  VALUES LESS THAN ( TO_DATE('01-12-2015','DD-MM-YYYY'), i.e. less than 01-Dec-2015

PARTITION per_limra_p002
  VALUES LESS THAN ( TO_DATE('01-01-2016','DD-MM-YYYY'), i.e. less than 01-Jan-2016

Даты в ваших запросах: DATE '2015-06-01', или 01-Jun-2015, и DATE '2015-05-01', или 01-May-2015, оба из которых попадают в диапазон для раздела per_limra_p004, который содержит данные для всех дат до 01 ноября 2015 года. Таким образом, оба запроса возвращают данные из одного раздела, поэтому они возвращают одно и то же значение.

Желаем удачи.

1
ответ дан Bob Jarvis 17 August 2018 в 12:36
поделиться

Oracle не постоянно обновляет свою статистику о таблицах и разделах, поскольку это будет слишком тяжело. После анализа таблицы статистика (например, те, что указаны в user_tab_partitions) будут обновлены. Поскольку у Oracle теперь разные статистические данные, оптимизатор может очень хорошо создавать разные планы выполнения для ваших запросов и, таким образом, влиять на производительность.

2
ответ дан Mureinik 17 August 2018 в 12:36
поделиться
  • 1
    Спасибо Mureinik, Как я хочу добавить некоторые новые разделы, но когда я ALTER TABLE tar ADD PARTITION tar_001 ЗНАЧИТ МЕНЬШЕ (TO_DATE ('01 -12-2015 ',' DD-MM-YYYY ')); Там возникла ошибка: ADD PARTITION не разрешено на сегментированном объекте Interval. Есть ли способ решить проблему без изменения атрибута «Interval partitioned»? – Tom 13 July 2018 в 15:16
  • 2
    @Tom с разделением интервалов, вам не нужно добавлять разделы. Просто вставьте свои данные, и оракул автоматически создаст необходимый раздел, как вы это делаете. – Mureinik 13 July 2018 в 17:48
  • 3
    Итак, на самом деле мы создаем секционированную таблицу, не нужно определять так много разделов вручную, а только один раздел, не так ли? PARTITION per_limra_p004 ЗНАЧЕНИЯ МЕНЬШЕ (TO_DATE ('01 -11-2015 ',' DD-MM-YYYY ')), – Tom 16 July 2018 в 03:02
  • 4
    @Tom yup. Шланг - это только начальные перегородки. Если у вас нет особых причин, чтобы определить их превентивно, просто не делайте этого. – Mureinik 16 July 2018 в 05:12
Другие вопросы по тегам:

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