<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                # 54.3\. 索引掃描 在一個索引掃描里,索引訪問方法負責把它拿到的那些據說匹配_掃描鍵字_的所有行之 TID 的回流。 訪問方法_不會_卷入從索引的父表中實際抓取這些行的動作中,也不會判斷他們是否通過了掃描的時間條件測試或者是其它條件。 一個掃描鍵字是形如`_index_key_` `_operator_``_constant_` 的`WHERE`子句的內部表現形式, 這里的索引鍵字是索引中的一個字段,而操作符是和該索引字段相關聯的操作符族的一個成員。 一個索引掃描擁有零個或者多個掃描鍵字,他們是隱含著 AND 的關系 —返回的行被認為是滿所所有列出的條件的行。 訪問方法可以聲稱自己是_有損的_或對特定的查詢需要再檢查。 這意味著,索引掃描會返回所有通過掃描鍵字的條目并可能加上一些不能通過的條目。 核心系統的索引掃描裝置之后會對堆元組應用索引條件以確認是否真的這個元組應該被選中。 如果再檢查選項沒有被指定,索引掃描必須精確返回匹配的條目。 請注意,確保找到所有條目以及確保所有條目都通過給出的掃描鍵字的條件完全是訪問方法的責任。 還有,核心系統將只是簡單的把所有匹配掃描鍵字和操作符族的`WHERE`子句傳遞過來,而不會做任何語義分析,以判斷他們是否冗余或者是否相互矛盾。 舉例來說,給出`WHERE x &gt; 4 AND x &gt; 14` where `x` ,這里的 `x`是一個 b-tree 索引字段, 那么把第一個掃描鍵字識別成冗余的和可拋棄的工作是 b-tree `amrescan`函數的事。 `amrescan`過程中所需要的預處理的范圍將由索引訪問方法把掃描鍵字縮減為一個"規范化"形式的具體需要而定。 一些訪問方法以明確的順序返回索引項,另外一些則不是。 實際上訪問方法可以支持兩種不同的排序輸出方法: * 以自然的數據順序返回條目的訪問方法(比如btree)應該設置`pg_am`.`amcanorder`為真。 當前,這樣的訪問方法必須為它們的相等和排序操作符使用btree兼容的策略數。 * 支持排序操作的訪問方法必須設置`pg_am`.`amcanorderbyop`為真。 這表明這個索引能夠以滿足`ORDER BY` `_index_key_``_operator_` `_constant_` 的順序返回條目。 這種形式的掃描修飾子能夠像前面描述的那樣被傳入`amrescan`。 `amgettuple`函數有一個`direction`參數,它可以是`ForwardScanDirection` (正常情況)或者 `BackwardScanDirection` 。 如果`amrescan`之后的第一次調用聲明`BackwardScanDirection`,那么匹配條件的索引記錄集是從后向前掃描的,而不是通常的從前向后掃描, 因此`amgettuple`必須返回索引中最后的匹配行,而不是通常情況下的第一條。 (這些事情只會在那些設置了`amcanorder`為真的訪問方法上會發生。) 在第一次調用之后,`amgettuple`必須準備從最近返回的條目的位置開始,在兩個方向上進行掃描步進。 (但是,如果`pg_am`.`amcanbackward`為假,所有隨后的調用將會和第一次調用使用相同的順序。) 支持排序掃描的訪問方法必須支持在掃描上"標記"位置,并在之后可以返回這個被標記的位置。 相同的位置可能被恢復多次。 然而,每次掃描只有一個位置需要被記住;一次新的`ammarkpos`調用會覆蓋先前被標記的位置。 不支持排序掃描的訪問方法仍然可以在`pg_am`中提供標記和恢復函數,但是如果被調用可以讓這些函數拋出錯誤。 掃描位置和標記位置(如果存在)都必須在面對索引中存在并發插入和刪除的時候保持一致性。 如果一條并發新插入的記錄并未被一次掃描返回(而如果掃描開始的時候該記錄就存在的話,則會被返回), 或者說掃描通過重新掃描或者回頭掃描返回這樣的記錄(即使它第一次跑的時候沒有返回這樣的行),對于系統來說,這種情況是可以接受的。 類似的還有,一個并發的刪除可以反映,也可以不反應一個掃描的結果。 重要的是,插入或者刪除不會導致掃描會略過或者重復返回本身不是被插入或者刪除的條目。 如果索引存儲原始的被索引數據值(而不是某種有損的表現形式),對支持index-only掃描是有用的, 這時,索引返回實際的數據而不僅是堆元組的TID。 只有在可見性映射顯示這個TID在一個全可見頁上是這才有效;否則還是必須檢查堆元組的MVCC可見性。 但是訪問方法不需要關心這件事。 作為`amgettuple`的替代,索引掃描可以可以通過一次`amgetbitmap`調用抓取所有元組來完成。 這明顯可能比`amgettuple`更高效,因為可以避免在訪問方法內部的加鎖解鎖。 一般而言,`amgetbitmap`和重復調用 `amgettuple`有相同的效果, 但是為了簡化我們加入了一些限制。 首先,`amgetbitmap`一次返回所有元組,并且不支持標記和恢復位置。 第二,在bitmap中返回的元組沒有任何指定的順序,這也是`amgetbitmap`沒有`direction`參數的原因。 (排序操作也就永遠不會被應用到這樣的掃描上) 既然沒有辦法返回被索引元組的內容,也就不會有使用`amgetbitmap`的index-only掃描。 最后,`amgetbitmap`不能保證對被返回元組上實施任何在[Section 54.4](#calibre_link-1144)中描述的鎖。 注意,如果一個訪問方法的內部實現不適合實現其中一個API的話, 允許一個訪問方法只實現`amgetbitmap`和`amgettuple`中的一個。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看