<sect1 id="performance.database">
    <title>Zend_Db שימוש נכון למיטב הביצועים</title>

    <para>
        <code>Zend_Db</code> הינה בסיס שכבות למחלקות אשר מטפלות במסדי נתונים, ונועדה
        כדי לתת API נפוץ לפעולות אשר נעשות על גבי ה SQL. <code>Zend_Db_Table</code>
        הינה מחלקת מידע לניתוב טבלאות מסדי נתונים, אשר מהוות בתור מחלקה כשכבה עליונה לכל המחלקות אשר נמצאות
        תחתיה, שנועדו למטרת ביצוע פעולות טבלאויות מול מסד הנתונים.
        מאחר ואלו מחלקות שאר מהוות שכבה עליונה לכל המחלקות תחתיהם, "והקסם" שהם מבצעות ברקע כדי לבצע את הפעולות שלהם,
        הם לעתים יכולים לגרום לבעיות משמעותיות בביצועים של המערכת.
    </para>

    <sect2 id="performance.database.tableMetadata">
        <title>אין ניתן להפחית את כמות המשאבים שצורכת המחלקה של Zend_Db_Table
               בזמן שליפת נתונים אודות טבלה/טבלאות?</title>

        <para>
            כדי לייעל ולפשט את השימוש כמה שניתן, ועדיין לתמוך בתרשים מסד הנתונים גם כשהוא משתנה תוך כדי פיתוח,
            <code>Zend_Db_Table</code> מבצעת מספר דברים מאחורי הקלעים: בשימוש הראשון,
            היא שולפת את כל התרשים של מסד הנתונים ושומרת את זה באובייקט מסויים לשימוש חוזר. פעולה זו היא בדרך כלל צורכת הרבה משאבים ויכולה לגרום
            לצוואר בקבוק במערכות, ולא משנה באיזה מסד נתונים משתמשים.
        </para>

        <para>
            למרבה המזל ישנם טכניקות שונות לשיפור התפעול במצבים כאלו.
        </para>

        <sect3 id="performance.database.tableMetadata.cache">
            <title>שימוש במטמון אודות הנתונים של המסד</title>

            <para>
                <code>Zend_Db_Table</code> יכולה להשתמש ב <code>Zend_Cache</code> כדי לשמור את הנתונים אודות התרשים של מסד הנתונים שנשלף במטמון.
                 בדרך זו יהיה מהיר יותר לגשת לנתונים ולצרוך פחות משאבים בכל פעם שמנסים לגשת לנתונים אודות מסד הנתונים שנשלפו.
            </para>

            <para>
                הדוקומנטציה של <link linkend="zend.db.table.metadata.caching"><code>Zend_Db_Table</code>
                מכילה מידע אודות שימוש במטמון במחלקה זו.</link>.
            </para>
        </sect3>

        <sect3 id="performance.database.tableMetadata.hardcoding">
            <title>כתיבה ידנית של המידע אודות הטבלה בהגדרות של אותה טבלה</title>

            <para>
                מאז גרסא 1.7.0, <code>Zend_Db_Table</code> מאפשר תמיכה ב <link
                    linkend="zend.db.table.metadata.caching.hardcoding">כתיבה ידנית של המידע אודות הטבלה בהגדרות של אותה טבלה</link>.
                זהו שימוש מתקדם יותר, ורצוי להשתמש בו רק כשתרשים הטבלה ידוע מראש וסביר להניח שהוא לא השתנה מאוחר יותר, או שתוכלו להמשיך ולעדכן את ההגדרות של הטבלה בכל פעם שתרשים הטבלה השתנה.
            </para>
        </sect3>
    </sect2>

    <sect2 id="performance.database.select">
        <title>פקודות SQL אשר נוצרו בעזרת Zend_Db_Select לא משתמשות באינדקסים של הטבלה; כיצד ניתן לשפר זאת?</title>

        <para>
            <code>Zend_Db_Select</code> בהחלט עושה עבודה טובה במה שהוא אמור לעשות.
             אך למרות זאת, במידה והנכם מבצעים שאילתות מסובכות למסד הנתונים אשר מכילות חיבורים בין טבלאות ותתי שאילתות, זה יכול להיות לפעמים תמים בנושא זה.
        </para>

        <sect3 id="performance.database.select.writeyourown">
            <title>כתבו את פונקציות השליפה כנגד מסד הנתונים בעצמכם</title>

            <para>
                התשובה האמיתית היחידה היא כתיבת פונקציות שליפת הנתונים שלכם בעצמכם;
                <code>Zend_Db</code> לא מחייב שימוש ב <code>Zend_Db_Select</code>, לכן כתיבת שאילות שליפת הנתונים שלכם בעצמכם היא בהחלט גישה תקינה,
            </para>
            <para>
                הריצו את פקודת ה <code>EXPLAIN</code> על גבי השאילתות שלכם על מנת לבדוק כמה וכמה גישות
                עד שתוכלו להגיע לשאילתה עם התוצאות הטובות ביותר.
            </para>

            <para>
                אם השאילתה דורשת הזנה של משתנים בתור נתונים, השתמשו ב"שומרי מקום" בשאילתות, והשתמשו בשילוב של
                <code>vsprintf</code> ו <code>array_walk</code> כדי להזין את אותם המשתנים אל השאילתות.
                לדוגמא:
            </para>

            <programlisting role="php"><![CDATA[
// $adapter is the DB adapter. In Zend_Db_Table, retrieve
// it using $this->getAdapter().
$sql = vsprintf(
    self::SELECT_FOO,
    array_walk($values, array($adapter, 'quoteInto'))
);
]]></programlisting>
        </sect3>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
