Postgresql規則與觸發器之比較

2021-01-11 IT168

【IT168 伺服器學院】    許多用觸發器可以幹的事情同樣也可以用 PostgreSQL 規則系統來完成。 目前不能用規則來實現的東西之一是某些約束,特別是外鍵。 我們可能在某欄位的值沒有在另一個表裡出現的情況下用一條有條件的規則把查詢重寫為 NOTHING。 不過這樣做數據就會被不聲不響的被仍掉,因而這也不是一個好主意。 如果需要檢查有效的值,而且如果是無效值出現時要生成一個錯誤信息, 這種情況下我們要用觸發器來做。

     另一方面,一個用於INSERT一個視圖的觸發器可以做到與規則一樣, 把數據放到另外的地方去而取代對視圖的插入。 但它不能在UPDATE或DELETE時做同樣的事情, 因為在視圖關係裡沒有可供掃描的真實數據,因而觸發器將永遠不被調用。 這時只有規則可用。

    對於兩者都可用的情況,哪個更好取決於對資料庫的使用。 觸發器為任何涉及到的行執行一次。規則修改查詢樹或生成額外的查詢。 所以如果在一個語句中涉及到多行, 一個生成一個額外查詢的規則通常可能會比一個對每一行都分別執行一次(因此要執行很多次)的觸發器要快一些。 不過,觸發器的方法從概念上要遠比規則的方法簡單,並且很容易讓新手可以做正確事情。

例如:這裡有兩個表

CREATE TABLE computer (
    hostname text,    -- indexed
    manufacturer    text     -- indexed
);

CREATE TABLE software (
    software text,    -- indexed
    hostname text     -- indexed
);
    兩個表都有好幾千行,並且hostname上的索引是唯一的。 規則/觸發器應該實現這樣一個約束,這個約束從software表中刪除引用已刪除計算機的行。觸發器可以用下面這條命令:

DELETE FROM software WHERE hostname = $1;
    因為觸發器是為從 computer 裡面刪除的每一個獨立的行調用一次,那麼它可以準備並且保存這個命令的規劃, 把hostname(主機名)作為參數傳遞。規則應該這樣寫

CREATE RULE computer_del AS ON DELETE TO computer
    DO DELETE FROM software WHERE hostname = OLD.hostname;

    現在我們看看這兩種不同的刪除。在下面情況

DELETE FROM computer WHERE hostname = ''mypc.local.net'';
    對表 computer 使用索引(快速)進行掃描並且由觸發器聲明的查詢也用索引進行掃描(同樣快速)。規則裡多出來的查詢是一個

DELETE FROM software WHERE computer.hostname = ''mypc.local.net''
         AND software.hostname = computer.hostname;
    因為已經建立了合適的索引,規劃器將創建一個下面的規劃

Nestloop
  ->  Index Scan using comp_hostidx on computer
  ->  Index Scan using soft_hostidx on software
所以在規則和觸發器的實現之間沒有太多的速度差別。

    下面的刪除我們希望刪掉所有 2000 個 hostname 以 old 開頭的計算機。 有兩個可能的用於這個用途的查詢。一個是

DELETE FROM computer WHERE hostname >= ''old''
         AND hostname <  ''ole''
規則增加的命令是

DELETE FROM software WHERE computer.hostname >= ''old'' AND computer.hostname < ''ole''
                       AND software.hostname = computer.hostname;
查詢的規劃將會是

Hash Join
  ->  Seq Scan on software
  ->  Hash
      ->  Index Scan using comp_hostidx on computer
另一個可能的查詢是

DELETE FROM computer WHERE hostname ~ ''^old'';
它由規則增加執行規劃是:

Nestloop
  ->  Index Scan using comp_hostidx on computer
  ->  Index Scan using soft_hostidx on software

    這表明,規劃器不能認識到表 computer 裡的hostname (計算機主機名)的條件在多個條件表達式以 AND 的方式組合在一起時同樣可以用於 software,就象在用正則表達式的查詢裡一樣。 觸發器將在任何 2000 個要被刪除的舊計算機裡被調用一次, 結果是對 computer 的一次索引掃描和對 software 的2000次索引掃描。 規則的實現將在兩個對索引的查詢實現之。 所以這是由 software 表的實際大小決定規則進行了順序掃描後是否還是快一些。 2000 個在 SPI 管理器上的查詢的執行是要點時間的, 即使所有要使用的索引塊都很快在緩衝裡出現。

    我們看的最後一個查詢是

DELETE FROM computer WHERE manufacurer = ''bim'';

    同樣,這也會導致從 computer 表裡的多行刪除。 所以觸發器同樣會向執行器提交很多查詢。規則生成的命令將會是

DELETE FROM software WHERE computer.manufacurer = ''bim''
                       AND software.hostname = computer.hostname;
    但規則規劃又將是對兩個索引掃描的嵌套循環。 只是用了 computer 的另外一個索引:

Nestloop
  ->  Index Scan using comp_manufidx on computer
  ->  Index Scan using soft_hostidx on software

    在任何一種情況下,從規則系統出來的額外查詢都或多或少與查詢中涉及到的行的數量相對獨立。

    概括來說,規則只是在它們的動作(action)生成了又大又爛的條件連接時才比觸發器有較大速度差異, 這時規劃器將失效

相關焦點

  • 施密特觸發器電路及工作原理詳解_施密特觸發器特點_施密特觸發器...
    >   什麼是施密特觸發器   施密特觸發器(Schmidt trigger)是包含正回授的比較器電路。   施密特觸發器的主要特點   施密特觸發電路是一種波形整形電路,當任何波形的信號進入電路時,輸出在正、負飽和之間跳動,產生方波或脈波輸出。不同於比較器,施密特觸發電路有兩個臨界電壓且形成一個滯後區,可以防止在滯後範圍內之噪聲幹擾電路的正常工作。如遙控接收線路,傳感器輸入電路都會用到它整形。
  • jk觸發器是什麼原理_jk觸發器特性表和狀態轉換圖
    JK觸發器具有置0、置1、保持和翻轉功能,在各類集成觸發器中,JK觸發器的功能最為齊全。在實際應用中,它不僅有很強的通用性,而且能靈活地轉換其他類型的觸發器。由JK觸發器可以構成D觸發器和T觸發器。   jk觸發器是什麼原理   JK觸發器是一種功能較完善,應用很廣泛的雙穩態觸發器。圖9-5(a)所示是一種典型結構的JK觸發器——主從型JK觸發器。
  • 脈衝和邊沿觸發器區別
    邊沿觸發器,指的是接收時鐘脈衝CP 的某一約定跳變(正跳變或負跳變)來到時的輸入數據。在CP=l 及CP=0 期間以及CP非約定跳變到來時,觸發器不接收數據的觸發器。   邊沿觸發器 具有下列特點的觸發器稱為邊沿觸發方式觸發器,簡稱邊沿觸發器。
  • d觸發器有什麼功能_常用d觸發器晶片有哪些-電子發燒友網
    觸發器有集成觸發器和門電路組成的觸發器。觸發方式有電平觸發和邊沿觸發兩種。   D觸發器在時鐘脈衝CP的前沿(正跳變0→1)發生翻轉,觸發器的次態取決於CP的脈衝上升沿到來之前D端的狀態,即次態=D。因此,它具有置0、置1兩種功能。由於在   CP=1期間電路具有維持阻塞作用,所以在CP=1期間,D端的數據狀態變化,不會影響觸發器的輸出狀態。
  • 動態邏輯觸發器:比特大陸礦機晶片的制勝法寶
    tcsEETC-電子工程專輯多米諾邏輯是一種比較成熟的動態邏輯結構,其主要形態是這樣的:tcsEETC-電子工程專輯我們在進行面積與功耗的大拇指規則 (rule of thumb) 評估時,功耗的權重是面積和速度的3倍以上。tcsEETC-電子工程專輯我們多米諾邏輯嘗試的失敗,並沒有打擊我們的探索,因為我們發現了一種適合動態邏輯其積大管子多的標準單元,而這種標準單元有一個很明顯的例子,就是觸發器Flip-flop。於是我們重回開始,以動態的觸發器做為攻堅目標。
  • 雙穩態觸發器的工作原理詳解
    雙穩態觸發器是脈衝和數字電路中常用的基本觸發器之一。雙穩態觸發器的特點是具有兩個穩定的狀態,並且在外加觸發信號的作用下,可以由一種穩定狀態轉換為另一種穩定狀態。在沒有外加觸發信號時,現有狀態將一直保持下去,雙穩態觸發器可以由電晶體、數字電路或時基電路等構成。
  • CMOS觸發器的結構與工作原理
    CMOS D觸發器足主-從結構形式的一種邊沿觸發器,CMOS T型觸發器、JK觸發器、計數單元、移位單元和各種時序電路都由其組成,因此儀以CMOS D觸發器為例進行說明。、TG4組成了從觸發器。TG1和TG3分別為主觸發器和從觸發器的輸入控制門。反相器G5、G6對時鐘輸入信號CP進行反相及緩衝,其輸出CP和CP′作為傳輸門的控制信號。根據CMOS傳輸門的工作原理和圖中控制信號的極性標註可知,當傳輸門TG1、TG4導通時,TG2、TG3截止;反之,當TG1、TG4截止時,TG2、TG3導通。
  • 總結觸發器工作原理和特性
    觸發器—具有觸發功能的存儲單元稱為觸發器。觸發器分類—主從觸發器、維持-阻塞觸發器、延遲觸發器。觸發器的現態和次態現態:觸發器在有效信號作用前的狀態。Qn或Q次態:觸發器在有效信號作用後的狀態。觸發器的功能觸發器的邏輯功能:S—R鎖存器: 保持、置1、置0D觸發器(數據鎖存): 置1、置0JK觸發器:保持、置1、置0、翻轉觸發器: 保持、翻轉D觸發器功能的轉換1、 D 觸發器構成 J K 觸發器
  • 一文看懂單穩態觸發器工作原理及作用
    單穩態觸發器輸出脈衝寬度tpo=1.1RC。   單穩態觸發器的四種基本電路圖   單穩態觸發器工作原理   單穩態觸發器的工作特點是:   1、在沒有受到外界觸發脈衝作用的情況下,單穩態觸發器保持在穩態;   2、在受到外界觸發脈衝作用的情況下,單穩態觸發器翻轉,進入「暫穩態」。
  • 觸發器的狀態轉移圖和激勵表
    描述觸發器的邏輯功能還可以採用圖形方式,即狀態轉移圖來描述。圖13-4為基本觸發器的狀態轉移圖。圖中兩個圓圈分別代表基本觸發器的兩個穩定狀態,箭頭表示在輸入信號作用下狀態轉移的方向,箭頭旁的標註表示狀態轉移時的條件。
  • 鎖存器Latch和觸發器Flip-flop有何區別
    門電路是由電晶體構成的,鎖存器是由門電路構成的,而觸發器是由鎖存器構成的。也就是電晶體-》門電路-》鎖存器-》觸發器,前一級是後一級的基礎。latch完成同一個功能所需要的門較觸發器要少,所以在asic中用的較多。
  • 啟輝器是什麼_啟輝器和觸發器有什麼區別
    打開APP 啟輝器是什麼_啟輝器和觸發器有什麼區別 發表於 2018-01-17 14:11:23 電子觸發器介紹 電子觸發器是一種可以存儲電路狀態的電子元件,有一種照明燈配件也叫電子觸發器。 用於高強度氣體放電燈(HID)的啟動,型號繁多。由於高強度氣體放電燈啟動時需要一個高電壓來使氣體電離進入等離子態,因而需要一個高壓發生器做為啟動器。這就是觸發器早期的機械型觸發器已經淘汰。
  • 確認過眼神,這就是PPT動畫裡面的觸發器!看看如何使用
    今天給大家分享PPT動畫裡面一個小眾的動畫技巧,就是PPT動畫裡面的「觸發器」使用方法。什麼是「觸發器」?可能有些小夥伴會問到,因為觸發器這個技能,大家平時使用的頻率還真是比較少……具體什麼東東?先來看看觸發器效果和功能,觸發器效果就是當我們點擊一張圖片或者一個圖形的時候,會彈出來另一張圖片或者形狀。
  • 數字電路中D觸發器和D鎖存器分別有什麼作用?
    打開APP 數字電路中D觸發器和D鎖存器分別有什麼作用?   D觸發器狀態轉換圖   D觸發器時序圖     數字電路中D觸發器和D鎖存器作用描述:   D型觸發器的輸入輸出關係簡單明了,是多位寄存器的基本結構。
  • 其實很簡單,使用觸發器就可以
    不過,現在迷你工坊裡這類型的地圖還比較少,於是就有一些喜歡自制地圖的玩家留言說希望能出一期這種類型地圖的製作教程,好多開發出一些更有意思的拼圖地圖。那麼,話不多說,就跟我一起來看看吧。
  • 觸發器音效是這樣被發現的……
    第三天早上,胖噠收到了新功能大佬——熊二送來的箱子,裡面有一臺「留聲機」和一封信:原來這一切都是熊二用觸發器音效製作出來的!《迷你世界》在下個版本即將在觸發器功能中加入音效分類,可以在觸發器-動作中添加音效分類下的控制項:還可以在觸發器界面調整音量、音調、設置循環播放,還有試聽按鈕可以隨時試聽音效,功能全面且強大哦!
  • 迷你世界觸發器教學:將自製門變為自動門,小學生都看呆了!
    之前教過大家如何製作一個門,現在教大家如何利用觸發器使它變成一個真的門。首先簡單地用淡藍色硬砂塊搭一個小屋,放上我們之前做好的門。門不能直接用微縮庫裡的,必須用我們添加的插件方塊哦。打開地圖編輯,新建一個觸發器,添加事件,選擇玩家—玩家點擊方塊,添加條件,選擇方塊—指定位置的方塊類型,設置方塊類型,選擇我們剛剛添加的微縮插件。添加動作,選擇計時器—等待時間,時間設置成0.1秒,添加下一個動作。
  • 迷你世界觸發器教學:怎麼自定義玩家的血量上限?
    哈嘍,大家好,我是研遊醬,一個喜歡玩遊戲的90後大叔,眾所周知《迷你世界》4周年周年狂歡上線了,今天分享一個自定義血量的教程,教大家觸發器,就是教大家如何在《迷你世界》裡面修改血量,但是再《迷你世界》裡 有的地圖需要玩家要兩百,甚至一千兩千的基礎血量,這是我們要選擇觸發器點擊事件,
  • 利用永恆之藍漏洞(MS17-010)入侵電腦
    前言:本篇教程主要講解通過kali中的MSF-Metasploit來利用永恆之藍漏洞入侵內網中的Windows7電腦。kalilinux攻擊機與Windows7靶機必須在同一網段,即同一區域網中。sudo service postgresql start2.查看是否成功開啟資料庫,Ctrl+c退出。sudo service postgresql status3.初始化msf資料庫,只需第一次啟用msf的時候初始化。
  • 老渣:江湖修行一陽指,心理觸發器總集
    所謂觸發器: 今天總結這61種心理觸發器, 善用則利,不用則廢; 1、認知失調 大多數人不行、不上、純BB。 不捧錢場不捧人場的對象別搭理。