Názor k článku PHP okénko: Získání počtu řádek od Satano - Podľa mňa COUNT(*) nie je nikdy odhadom, ale...

  • Článek je starý, nové názory již nelze přidávat.
  • 30. 3. 2005 23:27

    Satano (neregistrovaný)
    Podľa mňa COUNT(*) nie je nikdy odhadom, ale práve počtom riadkov viditeľných pre transakciu. A koľko riadkov transakcia vidí, záleží na jej úrovni izolácie (môžete, ale aj nemusíte vidieť nové riadky od iných transakcií). Akurát, že ten vrátený počet riadkov je presný práve iba v dobe (lepšie je asi v stave DB), kedy to tá transakcia ráta. S tým súvisí aj to, že vrátený počet riadkov nemusí byť správny ani bez transakcie. COUNT(*) si to všetko zráta, ale kým sa to spracuje (napr. PHPčkom) a odošle naspäť k vám (narp. vo forme www stránky), moholi byť do DB vložené ďalšie riadky, alebo niektoré vymazané, takže to číslo, čo vidíte v skutočnosti správne nie je. Ale nie je to ani odhad. Proste bolo správne v čase a stave, keď ho DB rátala.

    Trošku off-topic, ale k tomu zamykaniu tabuliek. Tiež som veľmi dlhú dobu nemusel tabuľky v DB zamykať. Nebol nejaký vážny dôvod pre to a okrem toho asi všetky projekty bez ohľadu na to, ako intenzívne využívali DB, ju využívali hlavne na čítanie a ak na zápis, tak tie zápisy sa medzi sebou 'nebili' (napr. užívatelia portálu si väčšinou modifikujú každý svoje dáta a pod.). Avšak pri poslednom projekte došlo aj na zamykanie tabuliek. Ako DB server je použitý PostgreSQL (a transakčné spracovanie samozrejme - kôli tomu bol vybraný namiesto MySQL). Ale problém bol, že užívatelia systému sa snažia pristupovať a meniť rovnaké dáta a bez zamykania tabuliek mi tam vznikali deadlocky. Tie zmizli, keď som začal tabuľky zamykať a okrem toho to malo pozitívny vplyv aj na výkon - citeľne klesol load na servri (asi vďaka odstráneniiu deadlockov).