Разный Cost для одного и того же запроса, почему??!

Sheriffua
Дата: 19.11.2009 12:56:01
Всем добрый день, такая проблема:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - 64bi
PL/SQL Release 10.2.0.1.0 - Production
CORE	10.2.0.1.0	Production
TNS for Linux IA64: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production
Когда работает приложение, то при выполнении следующего кода:
UPDATE /*+ INDEX (CARD PK_CARD)*/card
   SET ctrlsum = :1,
       flags = :2
 WHERE code = :3
Cost равен 11,294
и план запроса его трактует как:
<ExplainPlan>
  <PlanElement object_ID="0" id="0" operation="UPDATE STATEMENT" optimizer="ALL_ROWS" search_columns="0" cost="11.294">
    <PlanElements>
      <PlanElement object_ID="1" id="1" operation="UPDATE" object_owner="BESTZVIT" object_name="CARD" search_columns="0">
        <PlanElements>
          <PlanElement object_ID="1" id="2" operation="TABLE ACCESS" option="BY INDEX ROWID" object_owner="BESTZVIT" object_name="CARD" object_type="TABLE" search_columns="0" cost="11.294" cardinality="1" bytes="167" cpu_cost="2.171.306.808" io_cost="11.103" time="136">
            <PlanElements>
              <PlanElement object_ID="2" id="3" operation="INDEX" option="FULL SCAN" object_owner="BESTZVIT" object_name="PK_CARD" object_type="INDEX (UNIQUE)" search_columns="0" cost="11.293" cardinality="1" cpu_cost="2.171.297.227" io_cost="11.102" filter_predicates="TO_BINARY_DOUBLE("CODE")=:3" time="136"/>
            </PlanElements>
          </PlanElement>
        </PlanElements>
      </PlanElement>
    </PlanElements>
  </PlanElement>
</ExplainPlan>
Когда же запускаю этот же запрос в обычном редакторе, например Toad, то Cost равен уже 3 и план соответственно следующий:
<ExplainPlan>
  <PlanElement object_ID="0" id="0" operation="SELECT STATEMENT" optimizer="ALL_ROWS" cost="3" cardinality="1" bytes="28" cpu_cost="36.017" io_cost="3" time="1">
    <PlanElements>
      <PlanElement object_ID="1" id="1" operation="TABLE ACCESS" option="BY INDEX ROWID" optimizer="ANALYZED" object_owner="BESTZVIT" object_name="IPACK" object_type="TABLE" object_instance="1" cost="3" cardinality="1" bytes="28" cpu_cost="36.017" io_cost="3" time="1">
        <PlanElements>
          <PlanElement object_ID="2" id="2" operation="INDEX" option="UNIQUE SCAN" optimizer="ANALYZED" object_owner="BESTZVIT" object_name="IPACK_IDX2" object_type="INDEX (UNIQUE)" search_columns="3" cost="2" cardinality="1" cpu_cost="28.686" io_cost="2" access_predicates=""IPACK"."ORG"=265000007394754 AND "IPACK"."DATPER"=TO_DATE('1999-07-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') AND "IPACK"."TYPPER"=0" time="1"/>
        </PlanElements>
      </PlanElement>
    </PlanElements>
  </PlanElement>
</ExplainPlan>
В чем ошибка может быть и куда копать??!
orawish
Дата: 19.11.2009 13:04:22
Sheriffua
..В чем ошибка может быть и куда копать??!

для начала - исследуйте зависимость плана от типов данных, которые у вас в предикатах.
если так, то привидите бинды к потребным типам
Андрей Панфилов
Дата: 19.11.2009 13:06:09
Sheriffua
Когда же запускаю этот же запрос в обычном редакторе, например Toad, то Cost равен уже 3 и план соответственно следующий:


не похоже
wurdu
Дата: 19.11.2009 13:06:28
Даже в этом XML, который выложен здесь вместо нормального плана, видно что это абсолютно разные запросы. В первом случае это действительно update card, а во втором select from IPACK
CV
Дата: 19.11.2009 13:09:31
Sheriffua
Всем добрый день, такая проблема:

operation="UPDATE STATEMENT" optimizer="ALL_ROWS" 
Когда же запускаю этот же запрос в обычном редакторе, например Toad, то Cost равен уже 3 и план соответственно следующий:
 operation="SELECT STATEMENT" optimizer="ALL_ROWS" 
В чем ошибка может быть и куда копать??!


Ну да разные запросы
Sheriffua
Дата: 19.11.2009 13:11:07
Ошибся, исправляю.
Sheriffua
Дата: 19.11.2009 13:12:30
<ExplainPlan>
  <PlanElement object_ID="0" id="0" operation="UPDATE STATEMENT" optimizer="ALL_ROWS" cost="3" cardinality="1" bytes="167" cpu_cost="37.037" io_cost="3" time="1">
    <PlanElements>
      <PlanElement object_ID="1" id="1" operation="UPDATE" object_owner="BESTZVIT" object_name="CARD">
        <PlanElements>
          <PlanElement object_ID="1" id="2" operation="TABLE ACCESS" option="BY INDEX ROWID" optimizer="ANALYZED" object_owner="BESTZVIT" object_name="CARD" object_type="TABLE" object_instance="1" cost="3" cardinality="1" bytes="167" cpu_cost="37.037" io_cost="3" time="1">
            <PlanElements>
              <PlanElement object_ID="2" id="3" operation="INDEX" option="UNIQUE SCAN" optimizer="ANALYZED" object_owner="BESTZVIT" object_name="PK_CARD" object_type="INDEX (UNIQUE)" search_columns="1" cost="2" cardinality="1" cpu_cost="28.686" io_cost="2" access_predicates=""CODE"=TO_NUMBER(:3)" time="1"/>
            </PlanElements>
          </PlanElement>
        </PlanElements>
      </PlanElement>
    </PlanElements>
  </PlanElement>
</ExplainPlan>
План второго запроса.
PaulEr
Дата: 19.11.2009 13:19:16
Я могу быть неправ, в первом плане видно,что идет неявное преобразование
"TO_BINARY_DOUBLE("CODE")=:3"
во втором
""CODE"=TO_NUMBER(:3)"
Также, по первому запросу FS indexa, во втором US. Запросы с теми же параметрами выполняются? Если сделать не через bind-переменные, а подставить свои значения и сравнить планы?

Sincerely,
PaulEr
Sheriffua
Дата: 19.11.2009 13:19:17
Андрей Панфилов
Sheriffua
Когда же запускаю этот же запрос в обычном редакторе, например Toad, то Cost равен уже 3 и план соответственно следующий:


не похоже


Картинка по 1 плану
Sheriffua
Дата: 19.11.2009 13:19:43
Андрей Панфилов
Sheriffua
Когда же запускаю этот же запрос в обычном редакторе, например Toad, то Cost равен уже 3 и план соответственно следующий:


не похоже


Картинка по 2 плану