国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

PostgreSQL常見問題(FAQ)

2024-07-21 02:13:49
字體:
來源:轉載
供稿:網友

  常見問題

  1.1)postgresql 是什么?該怎么發音?

  1.2)誰控制和管理postgresql ?

  1.3)postgresql的版權是什么?

  1.4)postgresql可以運行在哪些操作系統平臺上?

  1.5)我從哪里能得到postgresql?

  1.6)最新版的postgresql 是什么?

  1.7)我從哪里能得到對postgresql 的支持?

  1.8)我如何提交一個bug報告?

  1.9)我如何了解已知的 bug 或暫缺的功能?

  1.10)能夠獲取的最新文檔有哪些?

  1.11)我應該怎樣學習 sql ?

  1.12)如何提交補丁或是加入開發隊伍?

  1.13)postgresql 和其他數據庫系統比起來如何?

  1.14)postgresql 可以處理最近各個國家夏時制的變化嗎?

  用戶客戶端問題

  2.1)我們可以用什么語言和postgresql 打交道?

  2.2)有什么工具可以把postgresql 用于 web 頁面?

  2.3)postgresql 擁有圖形用戶界面嗎?

  系統管理問題

  3.1)我怎樣才能把postgresql 裝在 /usr/local/pgsql 以外的地方?

  3.2)我如何控制來自其他電腦的連接?

  3.3)我怎樣調整數據庫服務器以獲得更好的性能?

  3.4)postgresql 里可以獲得什么樣的調試特性?

  3.5)為什么在試圖連接登錄時收到“sorry, too many clients” 消息?

  3.6)postgresql的升級過程有哪些內容?

  3.7)(使用postgresql)我需要使用什么計算機硬件 ?

  操作問題

  4.1) 如何只選擇一個查詢結果的頭幾行?或是隨機的一行?

  4.2) 如何查看表、索引、數據庫以及用戶的定義?如何查看psql里用到的查詢指令并顯示它們?

  4.3) 如何更改一個字段的數據類型?

  4.4) 單條記錄,單個表,一個數據庫的最大限制是多少?

  4.5) 存儲一個典型的文本文件里的數據需要多少磁盤空間?

  4.6) 為什么我的查詢很慢?為什么這些查詢沒有利用索引?

  4.7) 我如何才能看到查詢優化器是怎樣評估處理我的查詢的?

  4.8) 我怎樣做正則表達式搜索和大小寫無關的正則表達式查找?怎樣利用索引進行大小寫無關查找?

  4.9) 在一個查詢里,我怎樣檢測一個字段是否為 null?我如何才能準確排序而不論某字段是否含null值?

  4.10) 各種字符類型之間有什么不同?

  4.11.1) 我怎樣創建一個序列號型或是自動遞增的字段?

  4.11.2) 我如何獲得一個插入的序列號的值?

  4.11.3) 同時使用 currval() 會導致和其他用戶的沖突情況嗎?

  4.11.4) 為什么不在事務異常中止后重用序列號呢?為什么在序列號字段的取值中存在間斷呢?

  4.12) 什么是 oid?什么是 ctid ?

  4.13) 為什么我收到錯誤信息“error: memory exhausted in allocsetalloc()”?

  4.14) 我如何才能知道所運行的 postgresql 的版本?

  4.15) 我如何創建一個缺省值是當前時間的字段?

  4.16) 如何執行外連接(outer join)查詢?

  4.17) 如何執行涉及多個數據庫的查詢?

  4.18) 如何讓函數返回多行或多列數據?

  4.19) 為什么我在使用pl/pgsql函數存取臨時表時會收到錯誤信息“relation with oid ##### does not exist”?

  4.20) 目前有哪些數據復制方案可用?

  4.21) 為何查詢結果顯示的表名或列名與我的查詢語句中的不同?為何大寫狀態不能保留?

  常見問題 1.1)postgresql 是什么?該怎么發音?

  postgresql 讀作 post-gres-q-l,有時候也簡稱為postgres 。想聽一下其發音的人員可從這里下載聲音文件: mp3 格式 。

  postgresql 是面向目標的關系數據庫系統,它具有傳統商業數據庫系統的所有功能,同時又含有將在下一代 dbms 系統的使用的增強特性。postgresql 是自由免費的,并且所有源代碼都可以獲得。

  postgresql 的開發隊伍主要為志愿者,他們遍布世界各地并通過互聯網進行聯系,這是一個社區開發項目,它不被任何公司控制。 如想加入開發隊伍,請參見開發人員常見問題(faq) http://www.postgresql.org/files/documentation/faqs/faq_dev.html

  1.2) 誰控制postgresql ?

  如果你在尋找postgresql的掌門人,或是什么中央委員會,或是什么所屬公司,你只能放棄了---因為一個也不存在,但我們的確有一個 核心委員會和cvs管理組,但這些工作組的設立主要是為了進行管理工作而不是對postgresql進行獨占式控制,postgresql項目是由任何人均 可參加的開發人員社區和所有用戶控制的,你所需要做的就是訂閱郵件列表,參與討論即可(要參與postgresql的開發詳見 開發人員常問題 (developer's faq) 獲取信息)。

  1.3)postgresql的版權是什么?

  postgresql的發布遵從經典的bsd版權。它允許用戶不限目的地使用postgresql,甚至你可以銷售postgresql而不含源代碼也可以,唯一的限制就是你不能因軟件自身問題而向我們追訴法律責任,另外就是要求所有的軟件拷貝中須包括以下版權聲明。下面就是我們所使用的bsd版權聲明內容:

  postgresql數據庫管理系統

  部分版權(c)1996-2005,postgresql 全球開發小組,部分版權(c)1994-1996 加州大學董事

 ?。╬ortions copyright (c) 1996-2005,postgresql global development group portions copyright (c) 1994-6 regents of the university of california)

  允許為任何目的使用,拷貝,修改和分發這個軟件和它的文檔而不收取任何費用, 并且無須簽署因此而產生的證明,前提是上面的版權聲明和本段以及下面兩段文字出現在所有拷貝中。

 ?。╬ermission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.)

  在任何情況下,加州大學都不承擔因使用此軟件及其文檔而導致的對任何當事人的直接的, 間接的,特殊的,附加的或者相伴而生的損壞,包括利益損失的責任,即使加州大學已經建議了這些損失的可能性時也是如此。

 ?。╥n no event shall the university of california be liable to any party for direct, indirect, special, incidental, or consequential damages, including lost profits, arising out of the use of this software and its documentation, even if the university of california has been advised of the possibility of such damage.)

  加州大學明確放棄任何保證,包括但不局限于某一特定用途的商業和利益的隱含保證。 這里提供的這份軟件是基于“當作是”的基礎的,因而加州大學沒有責任提供維護,支持,更新,增強或者修改的服務。

 ?。╰he university of california specifically disclaims any warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. the software provided hereunder is on an "as is" basis, and the university of california has no obligations to provide maintenance, support, updates, enhancements, or modifications.)

  1.4)postgresql 可以運行在哪些操作系統平臺上?

  一般說來,任何現在對 unix 兼容的操作系統之上都能運行postgresql 。在安裝指南里列出了發布時經過明確測試的平臺。

  postgresql也可以直接運行在基于微軟windows-nt的操作系統,如win2000 sp4,winxp 和 win2003,已制作完成的安裝包可從 http://pgfoundry.org/projects/pginstaller下載,基于msdos的windows操作系統 (win95,win98,winme)需要通過cygwin模擬環境運行postgresql。

  同時也有一個為novell netware 6開發的版本可從 http://forge.novell.com/獲取,為os/2(ecomstation)開發的版本可從 http://hobbes.nmsu.edu/cgi-bin/h-search?sh=1&button=search&key=postgresql&stype=all&sort=type&dir=%2f 下載。

  1.5) 我從哪里能得到postgresql?

  通過瀏覽器可從http://www.postgresql.org/ftp/下載,也可通過ftp,從 ftp://ftp.postgresql.org/pub/站點下載。

  1.6) 最新版的postgresql是什么?

  postgresql 最新的版本是版本 8.2.1 。

  我們計劃每年發布一個主要升級版本,每幾個月發布一個小版本。

  1.7) 我從哪里能得到對postgresql的支持?

  postgresql社區通過郵件列表為其大多數用戶提供幫助,訂閱郵件列表的主站點是 http://www.postgresql.org/community/lists/,一般情況下,先加入general 或 bug郵件列表是一個較好的開始。

  主要的irc頻道是在freenode(irc.freenode.net)的#postgresql,為了連上此頻道,可以使用unix程序irc,其指令格式: irc -c '#postgresql' "$user" irc.freenode.net ,或者使用其他irc客戶端程序。在此網絡中還存在一個postgresql的西班牙頻道(#postgersql-es)和法語頻道 (#postgresql-fr)。同樣地,在efnet上也有一個postgresql的交流頻道。

  可提供商業支持的公司列表可在http://techdocs.postgresql.org/companies.php瀏覽。

  1.8) 我如何提交一個bug報告?

  可訪問 http://www.postgresql.org/support/submitbug,填寫bug上報表格即可,同樣也可訪問ftp站點ftp://ftp.postgresql.org/pub/ 檢查有無更新的postgresql版本或補丁。

  通過使用bug提交表格或是發往postgresql郵件列表的bug通常會有以下之一回復:

  所提交內容不是一個bug及其不是bug的原因。

  所提交內容是一個已知的bug并且已經加入todo待處理任務列表。

  所提交的bug已在當前版本中被修正。

  所提交的bug已修正但尚未將補丁加入現在的發布軟件包。

  請求提交者提供更詳細的信息:

  操作系統

  postgresql版本

  可重現bug的測試案例

  調試信息

  調試跟蹤輸出

  所提交內容是一個新bug,將執行以下工作:

  創建一個新補丁并將其加入下一個主要版本或是小的改進版本中。

  此bug暫時不能修正,將被加至todo待處理任務列表。

  1.9) 我如何了解已知的 bug 或暫缺的功能?

  postgresql 支持一個擴展的 sql:2003 的子集。參閱我們的todo 列表,了解已知bug列表、暫缺的功能和將來的開發計劃。

  要求增加新功能的申請通常會收到以下之一的回復:

  該功能已加入todo待處理任務列表。

  該功能不是必須的,因為:

  它是現有的且符合sql標準的某功能的重復。

  該功能性會大大增加代碼的復雜程序,而帶來的好處是微不足道的。

  該功能是不安全或是不可靠的。

  該功能將被加入todo待處理任務列表。

  postgresql不使用bug跟蹤系統,因為我們發現在郵件列表中直接回復以及保證todo任務列表總是處于最新狀態的方式工作效率會更高一些。事實上,bug不會在我們的軟件中存在很長時間,對影響很多用戶的bug也總是很快會被修正。唯一能找到所有改進、提高和修正的地方是cvs的日志信息,即使是在軟件新版本的發布信息中也不會列出每一處的軟件更新。

  1.10) 能夠獲取的最新文檔有哪些?

  postgresql包含大量的文檔,主要有詳細的參考手冊,手冊頁和一些的測試例子。參見 /doc 目錄(譯注:應為 $pghome/doc)。 你還可以在線瀏覽postgresql的手冊,其網址是:http://www.postgresql.org/docs。

  有兩本關于postgresql的書在線提供,在 http://www.postgresql.org/docs/awbook.html 和 http://www.commandprompt.com/ppbook/ 。 也有大量的postgresql書籍可供購買,其中最為流行的一本是由korry douglas編寫的。在 http://techdocs.postgresql.org/techdocs/bookreviews.php上 上有大量有關postgresql書籍的簡介。 在 http://techdocs.postgresql.org/上收集了有關postgresql的大量技術文章。

  客戶端的命令行程序psql有一些以 d 開頭的命令,可顯示關于類型,操作符,函數,聚合等信息,使用 ? 可以顯示所有可用的命令。

  我們的 web 站點包含更多的文檔。

  1.11) 我應該怎樣學習 sql ?

  首先考慮上述提到的與postgresql相關的書籍,另外一本是teach yourself sql in 21 days, second edition,其詳細介紹的網址是 http://members.tripod.com/er4ebus/sql/index.htm, 我們的許多用戶喜歡the practical sql handbook, bowman, judith s. 編寫,addison-wesley公司出版,其他的則喜歡 the complete reference sql, groff 編寫,mcgraw-hill公司出版。

  在下列網址上也有很好的教程,他們是

  http://www.intermedia.net/support/sql/sqltut.shtm

  http://sqlcourse.com/

  http://www.w3schools.com/sql/default.asp

  http://mysite.verizon.net/graeme_birchall/id1.html

  1.12)如何提交補丁或是加入開發隊伍?

  詳見 開發人員常見問題 (developer's faq) 。

  1.13)postgresql和其他數據庫系統比起來如何?

  評價軟件有好幾種方法:功能,性能,可靠性,支持和價格。

  功能 postgresql 擁有大型商用數據庫最多的功能,例如:事務,子查詢,觸發器,視圖,外鍵參考完整性和復雜的鎖定等。 我們還有一些它們沒有的特性,如用戶定義類型,繼承,規則和多版本并行控制以減少鎖的爭用等。

  性能 postgresql和其他商用和開源的數據庫具有類似的性能。對某些處理它比較快,對其他一些處理它比較慢。 與其他數據庫相比,我們的性能優劣通常在 +/- 10%之間。

  可靠性 我們都知道數據庫必須是可靠的,否則它就一點用都沒有。我們努力做到發布經過認真測試的,缺陷最少的穩定代碼。每個版本至少有一個月的 beta 測試時間,并且我們的發布歷史顯示我們可以提供穩定的,牢固的,可用于生產使用的版本。我們相信在這方面我們與其他的數據庫軟件是相當的。

  支持 我們的郵件列表提供一個非常大的開發人員和用戶的組以幫助解決所碰到的任何問題。我們不能保證總是能解決問題,相比之下,商用數據庫軟件也并不是總能夠提供解決方法。 直接與開發人員,用戶群,手冊和源程序接觸使postgresql的支持比其他數據庫還要好。還有一些商業性的全面技術支持,可以給提供給那些需要的人。(參閱1.7 小節)

  價格 我們對任何用途都免費,包括商用和非商用目的。 你可以不加限制地向你的產品里加入我們的代碼,除了那些我們在上面的版權聲明里聲明的 bsd版權之外的內容。 1.14) postgresql可以處理最近各個國家夏時制的變化嗎?

  postgresql 8.0之前的版本是使用操作系統中的時區數據庫來處理夏時制的信息,自8.0版及以后的版本postgresql會自身含有最新的時區信息。

  用戶客戶端問題 2.1) 我們可以用什么語言和postgresql打交道?

  postgresql(缺省情況)只安裝有c和內嵌式c的接口,其他的接口都是獨立的項目,能夠分別下載,這些接口項目獨立的好處 是他們可以有各自的發布計劃和各自獨立的開發組。

  一些編程語言如php都有訪問postgresql的接口,perl、tcl、python以及很多其他語言的接口在 http://gborg.postgresql.org/網站上的drivers/interfaces小節可找到, 并且通過internet很容易搜索到。

  2.2) 有什么工具可以把postgresql用于 web 頁面?

  一個介紹以數據庫為后臺的挺不錯的站點是:http://www.webreview.com/。

  對于 web 集成,php 是一個極好的接口。它在http://www.php.net/。

  對于復雜的任務,很多人采用 perl 接口和 使用cgi.pm的dbd::pg 或 mod_perl 。

  2.3)postgresql擁有圖形用戶界面嗎?

  商業用戶或是開源開發人員能找到很多的有關postgresql的gui圖形工具軟件,在 postgresql社區文檔有一個詳細的列表。

  系統管理問題 3.1)我怎樣能把postgresql裝在 /usr/local/pgsql 以外的地方?

  在運行 configure 時加上 --prefix 選項。

  3.2) 我如何控制來自其他電腦的連接?

  缺省情況下,postgresql只允許來自本機且通過 unix 域套接字或tcp/ip方式的連接。 你只有在修改了配置文件postgresql.conf中的listen_addresses,且也在配置文件$pgdata/pg_hba.conf中打開了 基于遠程電腦( host-based )的身份認證,并重新啟動postgresql,否則其他電腦是不能與你的postgresql服務器進行連接的。

  3.3) 我怎樣調整數據庫引擎以獲得更好的性能?

  有三個主要方面可以提升postgresql的潛能。

  查詢方式的變化 這主要涉及修改查詢方式以獲取更好的性能:

  創建索引,包括表達式和部分索引;

  使用copy語句代替多個insert語句;

  將多個sql語句組成一個事務以減少提交事務的開銷;

  從一個索引中提取多條記錄時使用cluster;

  從一個查詢結果中取出部分記錄時使用limit;

  使用預編譯式查詢(prepared query);

  使用analyze以保持精確的優化統計;

  定期使用 vacuum 或 pg_autovacuum

  進行大量數據更改時先刪除索引(然后重建索引)

  服務器的配置 配置文件postgres.conf中的很多設置都會影響性能,所有參數的列表可見: 管理員指南/數據庫服務器運行環境/數據庫服務器運行配置, 有關參數的解釋可見:http://www.varlena.com/varlena/generalbits/tidbits/annotated_conf_e.html 和 http://www.varlena.com/varlena/generalbits/tidbits/perf.html。 硬件的選擇 計算機硬件對性能的影響可瀏覽 http://candle.pha.pa.us/main/writings/pgsql/hw_performance/index.html 和 http://www.powerpostgresql.com/perflist/。 3.4)postgresql里可以獲得什么樣的調試特性?

  postgresql 有很多類似 log_* 的服務器配置變量可用于查詢的打印和進程統計,而這些工作對調試和性能測試很有幫助。

  3.5) 為什么在試圖連接時收到“sorry, too many clients(已有太多用戶連接)”消息?

  這表示你已達到缺省100個并發后臺進程數的限制,你需要通過修改postgresql.conf文件中的max_connections值來 增加postmaster的后臺并發處理數,修改后需重新啟動postmaster。

  3.6)postgresql的升級過程有哪些內容 ?

  postgresql 開發組對每次小版本的升級主要只做了一些bug修正工作,因此從 7.4.8 升級到 7.4.9 不需要 dump 和 restore,僅需要停止數據庫服務器,安裝更新后的軟件包,然后重啟服務器即可。

  所有postgresql的用戶應該在最接近(你所使用的主版本)的小改進版本發布盡快升級。盡管每次升級可能都有一點風險,postgresql的小改進版僅僅是設計用來修正一些bug的,代碼改動較少,所以風險還是很小的。postgresql社區認為一般情況下不升級的風險還是多于升級的。

  主版本的升級(例如從 7.3 到 7.4)通常會修改系統表和數據表的內部格式。 這些改變一般比較復雜,因此我們不維持數據文件的向后兼容性。因此從老版本中進行數據導出(dump)/然后在新版本中進行數據導入(reload)對主版本的升級是必須的。

  3.7)(使用postgresql)我需要使用什么計算機硬件 ?

  由于計算機硬件大多數是兼容的,人們總是傾向于相信所有計算機硬件質量也是相同的。事實上不是, ecc ram(帶奇偶校驗的內存),scsi (硬盤)和優質的主板比一些便宜貨要更加可靠且具有更好的性能。postgresql幾乎可以運行在任何硬件上, 但如果可靠性和性能對你的系統很重要,你就需要全面的研究一下你的硬件配置了。在我們的郵件列表上也有關于 硬件配置和性價比的討論。

  操作問題 4.1) 如何只選擇一個查詢結果的頭幾行?或是隨機的一行?

  如果你只是要提取幾行數據,并且你在執行查詢中知道確切的行數,你可以使用limit功能。 如果有一個索引與 order by中的條件匹配,postgresql 可能就只處理要求的頭幾條記錄, (否則將對整個查詢進行處理直到生成需要的行)。如果在執行查詢功能時不知道確切的記錄數, 可使用游標(cursor)和fetch功能。

  可使用以下方法提取一行隨機記錄的:

   select cols
   from tab
   order by random()
   limit 1 ;
4.2) 如何查看表、索引、數據庫以及用戶的定義?如何查看psql里用到的查詢指令并顯示它們?

  在psql中使用 dt 命令來顯示數據表的定義,要了解psql中的完整命令列表可使用? ,另外,你也可以閱讀 psql 的源代碼 文件pgsql/src/bin/psql/describe.c,它包括為生成psql反斜杠命令的輸出的所有 sql 命令。你還可以帶 -e 選項啟動 psql, 這樣它將打印出你在psql中所給出的命令執行時的內部實際使用的sql查詢語句。postgresql也提供了一個兼容sql的information schema接口, 你可以從這里獲取關于數據庫的信息。

  在系統中也有一些以pg_ 打頭的系統表也描述了表的定義。

  使用 psql -l 指令可以列出所有的數據庫。

  也可以瀏覽一下 pgsql/src/tutorial/syscat.source文件,它列舉了很多可從數據庫系統表中獲取信息的select語法。

  4.3) 如何更改一個字段的數據類型?

  在8.0版本里更改一個字段的數據類型很容易,可使用 alter table alter column type 。

  在以前的版本中,可以這樣做:

  begin;
  alter table tab add column new_col new_data_type;
  update tab set new_col = cast(old_col as new_data_type);
  alter table tab drop column old_col;
  commit;

  你然后可以使用vacuum full tab 指令來使系統收回無效數據所占用的空間。

  4.4) 單條記錄,單個表,單個數據庫的最大限制是多少?

  下面是一些限制:

單個數據庫最大尺寸?無限制(已存在有 32tb 的數據庫)
單個表的最大尺寸?32 tb
一行記錄的最大尺寸?1.6 tb
一個字段的最大尺寸?1 gb
一個表里最大行數?無限制
一個表里最大列數?250-1600 (與列類型有關)
一個表里的最大索引數量?無限制

  當然,實際上沒有真正的無限制,還是要受可用磁盤空間、可用內存/交換區的制約。 事實上,當上述這些數值變得異常地大時,系統性能也會受很大影響。

  單表的最大大小 32 tb 不需要操作系統對單個文件也需這么大的支持。大表用多個 1 gb 的文件存儲,因此文件系統大小的限制是不重要的。

  如果缺省的塊大小增長到 32k ,最大的單表大小和最大列數還可以增加到四倍。

  有一個限制就是不能對大小多于2000字節的列創建索引。幸運地是這樣的索引很少用到。通過對多字節列的內容進行md5哈稀運算結果進行函數索引可對列的唯一性得到保證, 并且全文檢索允許對列中的單詞進行搜索。

  4.5) 存儲一個典型的文本文件里的數據需要多少磁盤空間?

  一個 postgres 數據庫(存儲一個文本文件)所占用的空間最多可能需要相當于這個文本文件自身大小5倍的磁盤空間。

  例如,假設有一個 100,000 行的文件,每行有一個整數和一個文本描述。 假設文本串的平均長度為20字節。文本文件占用 2.8 mb。存放這些數據的postgresql數據庫文件大約是 6.4 mb:

   28 字節: 每行的頭(大約值)
   24 字節: 一個整數型字段和一個文本型字段
  + 4 字節: 頁面內指向元組的指針
  ----------------------------------------
   56 字節每行
  postgresql 數據頁的大小是 8192 字節 (8 kb),則:
  8192 字節每頁
  -------------------  = 146 行/數據頁(向下取整)
   56 字節每行
  100000 數據行
  -------------------- = 685 數據頁(向上取整)
   146 行/數據頁
  685 數據頁 * 8192 字節/頁 = 5,611,520 字節(5.6 mb)

  索引不需要這么多的額外消耗,但也確實包括被索引的數據,因此它們也可能很大。

  空值null存放在位圖中,因此占用很少的空間。

  4.6) 為什么我的查詢很慢?為什么這些查詢沒有利用索引?

  并非每個查詢都會自動使用索引。只有在表的大小超過一個最小值,并且查詢只會選中表中較小比例的記錄時才會采用索引。 這是因為索引掃描引起的隨即磁盤存取可能比直接地讀取表(順序掃描)更慢。

  為了判斷是否使用索引,postgresql必須獲得有關表的統計值。這些統計值可以使用 vacuum analyze,或 analyze 獲得。 使用統計值,優化器知道表中有多少行,就能夠更好地判斷是否利用索引。 統計值對確定優化的連接順序和連接方法也很有用。在表的內容發生變化時,應定期進行統計值的更新收集。

  索引通常不用于 order by 或執行連接。對一個大表的一次順序掃描再做一次排序通常比索引掃描要快。然而,如果將 limit 和 order by 結合在一起使用的話,通常將會使用索引,因為這時僅返回表中的一小部分記錄。

  如果你確信postgresql的優化器使用順序掃描是不正確的,你可以使用set enable_seqscan to 'off'指令來關閉順序掃描, 然后再次運行查詢,你就可以看出使用一個索引掃描是否確實要快一些。

  當使用通配符操作,例如 like 或 ~ 時,索引只能在特定的情況下使用:

  字符串的開始部分必須是普通字符串,也就是說:

  like 模式不能以 % 打頭。

  ~ (正則表達式)模式必須以 ^ 打頭。

  字符串不能以匹配多個字符的模式類打頭,例如 [a-e]。

  大小寫無關的查找,如 ilike 和 ~* 等不使用索引,但可以用 4.8 節描述的表達式索引。

  在做 initdb 時必須采用缺省的本地設置 c locale,因為系統不可能知道在非c locale情況時下一個最大字符是什么。 在這種情況下,你可以創建一個特殊的text_pattern_ops索引來用于like的索引。

  在8.0之前的版本中,除非要查詢的數據類型和索引的數據類型相匹配,否則索引經常是未被用到,特別是對int2,int8和數值型的索引。

  4.7) 我如何才能看到查詢優化器是怎樣評估處理我的查詢?

  參考 explain 手冊頁。

  4.8) 我怎樣做正則表達式搜索和大小寫無關的正則表達式查找?怎樣利用索引進行大小寫無關查找?

  操作符 ~ 處理正則表達式匹配,而 ~* 處理大小寫無關的正則表達式匹配。大小寫無關的 like 變種成為 ilike。

  大小寫無關的等式比較通常寫做:

  select *
  from tab
  where lower(col) = 'abc';

  這樣將不會使用標準的索引。但是可以創建一個在這種情況下使用的表達式索引:

  create index tabindex on tab (lower(col));

  如果上述索引在創建時加入unique約束,雖然索引字段自身內容可以存儲大小寫不限的內容,但如果有unique約束后,這些內容不能僅僅是大小寫不同(否則會造成沖突)。為了保證不發生這種情況,可以使用check約束條件或是觸發器在錄入時進行限制。

  4.9) 在一個查詢里,我怎樣檢測一個字段是否為 null ?我如何才能準確排序而不論某字段是否含 null 值?

  用 is null 和 is not null 測試這個字段,具體方法如下:

  select *
  from tab
  where col is null;

  為了能對含 null字段排序,可在 order by 條件中使用 is null和 is not null 修飾符,條件為真 true 將比條件為假false 排在前面,下面的例子就會將含 null 的記錄排在結果的上面部分:

  select *
  from tab
  order by (col is not null)
4.10) 各種字符類型之間有什么不同?

類型內部名稱說明
varchar(n)varchar指定了最大長度,變長字符串,不足定義長度的部分不補齊
char(n)bpchar定長字符串,實際數據不足定義長度時,以空格補齊
texttext沒有特別的上限限制(僅受行的最大長度限制)
byteabytea變長字節序列(使用null字符也是允許的)
"char"char單個字符

  在系統表和在一些錯誤信息里你將看到內部名稱。

  上面所列的前四種類型是"varlena"(變長)類型(也就是說,開頭的四個字節是長度,后面才是數據)。 于是實際占用的空間比聲明的大小要多一些。 然而這些類型如定義很長時都可以被壓縮存儲,因此磁盤空間也可能比預想的要少。

  varchar(n) 在存儲限制了最大長度的變長字符串是最好的。 text 適用于存儲最大可達 1g左右但未定義限制長度的字符串。

  char(n) 最適合于存儲長度相同的字符串。 char(n)會根據所給定的字段長度以空格補足(不足的字段內容), 而 varchar(n) 只存儲所給定的數據內容。 bytea 用于存儲二進制數據,尤其是包含 null 字節的值。這些類型具有差不多的性能。

  4.11.1) 我怎樣創建一個序列號或是自動遞增的字段?

  postgresql 支持 serial 數據類型。(字段定義為serial后)將自動創建一個序列生成器,例如:

  create table person (
   id  serial,
   name text
  );

  會自動轉換為以下sql語句:

  create sequence person_id_seq;
  create table person (
   id  int4 not null default nextval('person_id_seq'),
   name text
  );

  參考 create_sequence 手冊頁獲取關于序列生成器的更多信息。

  4.11.2) 我如何獲得一個插入的序列號的值?

  一種方法是在插入之前先用函數 nextval() 從序列對象里檢索出下一個 serial 值,然后再用此值精確地插入。使用 4.11.1 里的例表,可用偽碼這樣描述:

  new_id = execute("select nextval('person_id_seq')");
  execute("insert into person (id, name) values (new_id, 'blaise pascal')");

  這樣還能在其他查詢中使用存放在 new_id 里的新值(例如,作為參照 person 表的外鍵)。 注意自動創建的 sequence 對象的名稱將會是 <table>_<serialcolumn>_seq, 這里 table 和 serialcolumn 分別是你的表的名稱和你的 serial 字段的名稱。

  類似的,在 serial 對象缺省插入后你可以用函數 currval() 檢索剛賦值的 serial 值,例如:

  execute("insert into person (name) values ('blaise pascal')");
  new_id = execute("select currval('person_id_seq')");
4.11.3) 同時使用 currval() 會導致和其他用戶的沖突情況嗎?

  不會。currval() 返回的是你本次會話進程所賦的值而不是所有用戶的當前值。

  4.11.4) 為什么不在事務異常中止后重用序列號呢?為什么在序列號字段的取值中存在間斷呢?

  為了提高并發性,序列號在需要的時候賦予正在運行的事務,并且在事務結束之前不進行鎖定, 這就會導致異常中止的事務后,序列號會出現間隔。

  4.12) 什么是 oid ?什么是 ctid ?

  postgresql 里創建的每一行記錄都會獲得一個唯一的oid,除非在創建表時使用without oids選項。 oid創建時會自動生成一個4字節的整數,所有 oid 在相應postgresql服務器中均是唯一的。 然而,它在超過40億時將溢出, oid此后會出現重復。postgresql 在它的內部系統表里使用 oid 在表之間建立聯系。

  在用戶的數據表中,最好是使用serial來代替oid 因為serial只要保證在單個表中的數值是唯一的就可以了,這樣它溢出的可能性就非常小了, serial8可用來保存8字節的序列數值。

  ctid 用于標識帶著數據塊(地址)和(塊內)偏移的特定的物理行。 ctid 在記錄被更改或重載后發生改變。索引數據使用它們指向物理行。

  4.13) 為什么我收到錯誤信息“error: memory exhausted in allocsetalloc()”?

  這很可能是系統的虛擬內存用光了,或者內核對某些資源有較低的限制值。在啟動 postmaster 之前試試下面的命令:

  ulimit -d 262144
  limit datasize 256m

  取決于你用的 shell,上面命令只有一條能成功,但是它將把你的進程數據段限制設得比較高, 因而也許能讓查詢完成。這條命令應用于當前進程,以及所有在這條命令運行后創建的子進程。 如果你是在運行sql客戶端時因為后臺返回了太多的數據而出現問題,請在運行客戶端之前執行上述命令。

  4.14) 我如何才能知道所運行的postgresql的版本?

  從 psql 里,輸入 select version();指令。

  4.15) 我如何創建一個缺省值是當前時間的字段?

  使用 current_timestamp:

  create table test (x int, modtime timestamp default current_timestamp );4.16) 我怎樣進行 outer join (外連接)?

  postgresql 采用標準的 sql 語法支持外連接。這里是兩個例子:

  select *
  from t1 left outer join t2 on (t1.col = t2.col);

  或是

  select *
  from t1 left outer join t2 using (col);

  這兩個等價的查詢在 t1.col 和 t2.col 上做連接,并且返回 t1 中所有未連接的行(那些在 t2 中沒有匹配的行)。 右[外]連接(right outer join)將返回 t2 中未連接的行。 完全外連接(full outer join)將返回 t1 和 t2 中未連接的行。 關鍵字 outer 在左[外]連接、右[外]連接和完全[外]連接中是可選的,普通連接被稱為內連接(inner join)。

  4.17) 如何使用涉及多個數據庫的查詢?

  沒有辦法查詢當前數據庫之外的數據庫。 因為postgresql要加載與數據庫相關的系統目錄(系統表),因此跨數據庫的查詢如何執行是不定的。

  附加增值模塊contrib/dblink允許采用函數調用實現跨庫查詢。當然用戶也可以同時連接到不同的數據庫執行查詢然后在客戶端合并結果。

  4.18) 如何讓函數返回多行或多列數據?

  在函數中返回數據記錄集的功能是很容易使用的,詳情參見: http://techdocs.postgresql.org/guides/setreturningfunctions

  4.19) 為什么我在使用pl/pgsql函數存取臨時表時會收到錯誤信息“relation with oid ##### does not exist”?

  pl/pgsql會緩存函數的腳本內容,由此帶來的一個不好的副作用是若一個 pl/pgsql 函數訪問了一個臨時表,然后該表被刪除并重建了,則再次調用該函數將失敗, 因為緩存的函數內容仍然指向舊的臨時表。解決的方法是在 pl/pgsql 中用execute 對臨時表進行訪問。這樣會保證查詢在執行前總會被重新解析。

  4.20) 目前有哪些數據復制方案可用?

  “復制”只是一個術語,有好幾種復制技術可用,每種都有優點和缺點:

  主/從復制方式是允許一個主服務器接受讀/寫的申請,而多個從服務器只能接受讀/select查詢的申請, 目前最流行且免費的主/從postgresql復制方案是 slony-i 。

  多個主服務器的復制方式允許將讀/寫的申請發送給多臺的計算機,這種方式由于需要在多臺服務器之間同步數據變動 可能會帶來較嚴重的性能損失,pgcluster是目前這種方案 中最好的,而且還可以免費下載。

  也有一些商業需付費和基于硬件的數據復制方案,支持上述各種復制模型。

  4.21) 為何查詢結果顯示的表名或列名與我的查詢語句中的不同?為何大寫狀態不能保留?

  最常見的原因是在創建表時對表名或是列名使用了雙引號“”,當使用了雙引號后,表名或列名(稱為標識符)存儲時是區分 大小寫的, 這意謂著你在查詢時表名或列名也應使用雙引號,一些工具軟件,像pgadmin會在發出創建表的指令時自動地在每個標識符上加雙引號。 因此,為了標識符的統一,你應該:

  在創建表時避免將標識符使用雙引號引起來。

  在標識符中只使用小寫字母。

  (為了與已存在的標識符相同)在查詢中使用雙引號將標識符引起來。

  • 本文來源于網頁設計愛好者web開發社區http://www.html.org.cn收集整理,歡迎訪問。
  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    主站蜘蛛池模板: 英山县| 蓝山县| 澄城县| 拜泉县| 磐安县| 万荣县| 温州市| 东明县| 福鼎市| 论坛| 海晏县| 武安市| 云安县| 樟树市| 巴林右旗| 剑河县| 张家港市| 务川| 太仓市| 涟源市| 赤水市| 怀来县| 阜南县| 绥滨县| 社会| 古田县| 宣威市| 巴林左旗| 扎兰屯市| 潜山县| 富源县| 泰安市| 双城市| 元朗区| 桐柏县| 大兴区| 宁波市| 镶黄旗| 天气| 蒲城县| 贵港市|