Oracle分区表 - 如何计算

时间:2017-07-25 13:06:32

标签: oracle oracle11g partitioning

我在Oracle(11g)上有一个分区表(MYTABLE)。 这是一个非常大的表,由INSERT_DATE列分区(没有时间)。

问题在于, Count(*)给出的结果不正确

以下查询返回:5,726,829,673

SELECT count(*) FROM MYTABLE WHERE INSERT_DATE >= TO_DATE('01/01/2015', 'DD/MM/YYYY')

以下查询返回:13,076,228,720

SELECT SUM(1) FROM MYTABLE WHERE INSERT_DATE >= TO_DATE('01/01/2015', 'DD/MM/YYYY')

怎么可能?这种差异的原因是什么?

1 个答案:

答案 0 :(得分:0)

检查两个查询的执行计划的 ```#!/bin/ksh /* FileList="/data1/RBIADF_SFTP/Outbound/logs/Filelist.lst" */ /* IniFile="/data1/RBIADF_SFTP/CommonFiles/inbound.ini" */ /* ProcessLog="/data1/RBIADF_SFTP/Outbound/logs/ProcessLogs.Log" */ echo $(date '+%d/%m/%Y %H:%M:%S') ": Directory File Watcher Started..." >> $ProcessLog while [ 0 ] do Loop=0 while IFS="," read -r f1 f2 f3 f4 f5 f6 do if [ $Loop != 0 ] then if [ "${f5}" != "NA" ]; then IsFileFound=$(find "${f5}" \( ! -name $f6 -o -type f \) -prune -type f | wc -l) if [ $IsFileFound -ge 1 ]; then echo $(date '+%d/%m/%Y %H:%M:%S') ": ##STRART TRANSACTION##" >> $ProcessLog echo $(date '+%d/%m/%Y %H:%M:%S') ": File Found Processing Started... " >> $ProcessLog echo $(date '+%d/%m/%Y %H:%M:%S') ": Processing File type= $f1, local path=$f5, SFTP Path =$f4" >> $ProcessLog ls -p $f5 | grep -v / >> $ProcessLog ls -p $f5 | grep -v / > $FileList dirpath=$f5 DIR_NAME=$(date '+%d%m%Y') sh PUTFILES.sh $f4 $f5 sleep 5 echo $(date '+%d/%m/%Y %H:%M:%S') ": File Get Completed." >> $ProcessLog Archive_FOLDER_COUNT=$(find "${f5}/archive/" \( ! -name 'archive' -o -type d \) -prune -type d | wc -l) echo $(date '+%d/%m/%Y %H:%M:%S') ": Local File Archive Started. Archive Path=$f5/archive/$DIR_NAME" >> $ProcessLog if [ $Archive_FOLDER_COUNT != '1' ] then mkdir $f5/archive/ fi FOLDER_COUNT=$(find "${f5}/archive/$DIR_NAME" \( ! -name $DIR_NAME -o -type d \) -prune -type d | wc -l) if [ $FOLDER_COUNT != '1' ] then mkdir $f5/archive/$DIR_NAME fi while IFS="," read -r sf1 do echo $dirpath/$sf1 $dirpath/archive/$DIR_NAME/ mv $dirpath/"${sf1}" $dirpath/archive/$DIR_NAME/ done <"$FileList" echo $(date '+%d/%m/%Y %H:%M:%S') ": Processing File type= $f1 Completed.." >> $ProcessLog echo $(date '+%d/%m/%Y %H:%M:%S') ": ##END TRANSACTION##" >> $ProcessLog fi fi fi let "Loop=Loop+1" done <"$IniFile" done ``` ``` ##### PUTFILES.sh #### cd $2 #!/bin/ksh HOST=dpcftpuat.hbctxdom.com PORT=22 USER=rbisftp PASS_DIR="/home/oracle/autoscp/enc_pass_dir" export PASS_DIR PASSWORD=`cat $PASS_DIR/pass_dpcftpuat.hbctxdom.com.enc|openssl enc -aes-128-cbc -a -d -salt -pass pass:hdfc` export HOST PORT USER PASSWORD SOURCE_FILE TARGET_DIR ##- Call expect /usr/bin/expect<< EOF set timeout -1 spawn /usr/bin/sftp $USER@$HOST expect "password:" send "$PASSWORD\r" expect "sftp>" send "cd $1/ \r" expect "sftp>" send "mput *.* \r" expect "sftp>" send "bye\r" EOF echo "SFTP DONE" exit ``` 部分-是否有计划管理功能导致查询使用根本不同的计划?运行Note,然后运行explain plan for SELECT ...,以确定Oracle是否以不同的方式运行查询。

例如,一个DBA可能已经在select * from table(dbms_xplan.display);版本上创建了一个SQL配置文件,迫使优化器使用索引,并且该索引已损坏,需要重新构建。

或者某些邪恶的开发人员使用count(*)来从字面上更改查询文本,但仅针对其中一条语句。检查DBMS_ADVANCED_REWRITE中是否有任何条目。