有没有办法从这个sql语句和逻辑中删除select count(*)

is there a way to remove the select count(*) from this sql statement and logic

本文关键字:删除 select count 语句 sql 有没有      更新时间:2023-10-16

我有一些C++代码,当一行存在时,它会更新一列,否则什么都不做。这是我的代码现在的样子,select count(*)大约需要15-20秒。我想让这个代码更有效率。

RunUpdateLockAliveTimeStamp

  sCommand << "update APP_CC_LOCKS set ALIVETIMESTAMP = ";
  sCommand << " SYSTIMESTAMP(7)";
  sCommand << " where TRANSACTIONID = ?";

RunSelectCountDataCubeLock

  sCommand << "select count(*) from APP_CC_LOCKS";
  sCommand << " where (((SCENARIOID=? and YEARID=? and ENTITYID=? and PARENTID=? and VALUEID=?) and (LOCKTYPE = ?)) or (LOCKTYPE = ?)) and (TRANSACTIONID != ?) and ((TIMEINSERTED < (select MAX(TIMEINSERTED) from APP_CC_LOCKS ";
  sCommand << " where TRANSACTIONID = ?)) or ((TIMEINSERTED = (select MAX(TIMEINSERTED) from ";
  sCommand << “ APP_CC_LOCKS where TRANSACTIONID = ?)) and TRANSACTIONID <= ?))";

        DWORD dwIterationNumber = 0;
        // trying to accquire lock
        cStartTime = DateTimeUtil::currentDateTimeAsMilliseconds();
        while (bLockWasAcquired == false)
        {
              // try to accquire lock
              numBlockingRecords = -1;
              hr = cAccessor.RunSelectCountDataCubeLock(csTransID, lScenario, lYear, lEntity, lParent, lValue, &numBlockingRecords);
              xfm_throw_propagate(FAILED(hr), hr);
              // There's no block record then lock is temporary accquired until we resolve collision
              if (numBlockingRecords == 0)
              {
                    // The lock is now accquired
                    bLockWasAcquired = true;
                    break;
              }
              if (dwIterationNumber > g_lNumIterBeforeUpdatingTimeStamp)
              {
                    //csSQLCmd.clear();
                    hr = cAccessor.RunUpdateLockAliveTimeStamp(csTransID);
                    xfm_throw_propagate(FAILED(hr), hr);
              }
        }

我不认为count(*)是导致查询速度变慢的原因,而是where子句中执行的两个子选择。

...((TIMEINSERTED < (select MAX(TIMEINSERTED) from APP_CC_LOCKS where TRANSACTIONID = ?))    
or ((TIMEINSERTED = (select MAX(TIMEINSERTED) from APP_CC_LOCKS where TRANSACTIONID = ?))

可以用一个子选择取代:

((TIMEINSERTED <= (select MAX(TIMEINSERTED) from APP_CC_LOCKS where TRANSACTIONID = ?))

这可能会使执行时间减半。