2008-09-30 56 views
3

如何讓他們在測試環境和生產環境之間保持同步?你把你的索引放在源碼控制中嗎?

當涉及到數據庫表的索引時,我的理念是它們是編寫查詢數據庫的任何代碼的必要組成部分。在不分析對索引的影響的情況下,您不能引入新的查詢或更改查詢。

因此,我盡我所能讓所有環境中的索引保持同步,但說實話,我在自動化方面做得並不好。這是一種偶然的手動過程。

我週期性地查看索引統計信息並刪除不必要的索引。我通常通過創建一個刪除腳本來完成此操作,然後將其複製回其他環境。

但是這裏和那裏的索引是在正常流程之外創建和刪除的,並且很難看出差異在哪裏。

我發現一件事情,真正幫助是去用簡單的,數字索引的名字,像

idx_t_01 
idx_t_02 

其中T是一臺很短的縮寫。我發現索引維護是不可能的,當我試圖聰明地涉及所有列時,例如,

idx_c1_c2_c5_c9_c3_c11_5 

這很難區分這樣的索引。

有沒有人有一個很好的方法來將索引維護集成到源代碼管理和開發生命週期中?

回答

5

是,任意 DML或DDL更改是腳本化和檢入到源代碼控制,主要是通過rails中的activerecord遷移。我討厭不斷地推出鐵軌的角,但是在建立基於DB的系統的多年中,我發現遷移路線比我使用或構建的任何自制系統要好得多。

但是,我確實列出了所有的索引(不要讓DBMS拿出任何瘋狂的名字)。 不要在它們前加,這很愚蠢(因爲你在sysobjects中有類型元數據,或者在你有的任何數據庫中有類型元數據),但是我包含了表名和列,例如, tablename_col1_col2。

這樣,如果我瀏覽sysobjects我可以很容易地看到一個特定表的索引(這也是一種習慣的力量,wayyyy在我使用的某些dBMS中返回,索引名稱在整個數據庫中是唯一的,所以唯一確保使用唯一名稱的方法是)。

11

索引是數據庫模式的一部分,因此應該與其他所有數據源一起進行源代碼管理。沒有經過正常的質量保證和發佈過程 - 尤其是性能測試,沒有人應該去創建生產索引。

在模式版本控制方面有很多其他的線程。

0

我不把我的索引放在源代碼管理中,但是索引的創建腳本。;-)

指數命名:

  • IX_CUSTOMER_NAME爲表中的 「客戶」 領域的 「名」
  • PK_CUSTOMER_ID主鍵,
  • UI_CUSTOMER_GUID,爲的GUID場客戶是唯一的(因此「UI」 - 唯一索引)。
6

您的數據庫的完整架構應該位於您的代碼旁邊的源代碼管理中。當我說「完整模式」時,我的意思是表格定義,查詢,存儲過程,索引等等。

在進行全新安裝時,您需要: - 檢查產品的X版本。 - 從結帳的「數據庫」目錄中,運行數據庫腳本以創建數據庫。 - 使用結賬中的代碼庫與數據庫進行交互。

在開發時,每個開發人員都應該對自己的私有數據庫實例進行操作。當他們進行模式更改時,他們將簽入一組新的模式定義文件,這些文件可以針對其修訂的代碼庫起作用。

使用此方法,您永遠不會遇到代碼庫 - 數據庫同步問題。

0

我總是使用源代碼控制SQL(DDL,DML等)。其代碼像其他任何其他。它的良好做法。

0

我不確定在不同的環境下索引應該是相同的,因爲它們有不同的數據大小。除非您的測試和生產環境具有相同的確切數據,否則索引會有所不同。

至於它們是否屬於源代碼管理,我不太確定。

+0

有一個體面的數據庫,這應該不重要,它的優化器/規劃師的工作,以決定是否要使用索引或不。 您應該在所有環境中使用它,否則在生產之前可能看不到索引維護所導致的性能問題。 – 2008-09-30 14:01:42

1

我認爲這裏有兩個問題:索引命名約定,並將數據庫更改添加到您的源代碼管理/生命週期。我會解決後一個問題。

我一直是Java程序員很長一段時間了,但最近已經引入到一個系統,該系統使用Ruby on Rails作爲系統的一部分數據庫訪問。我喜歡RoR的一點是「遷移」的概念。基本上,您有一個目錄充滿了001_add_foo_table.rb,002_add_bar_table.rb,003_add_blah_column_to_foo.rb等文件。這些Ruby源文件擴展了一個父類,覆蓋了稱爲「向上」和「向下」的方法。 「up」方法包含一組數據庫更改,這些更改需要將數據庫架構的先前版本引入當前版本。同樣,「down」方法會將更改恢復爲以前的版本。當您想要爲特定版本設置模式時,Rails遷移腳本會檢查數據庫以查看當前版本,然後找到可從此處上移(或下移)到所需修訂的.rb文件。

爲了使這部分開發過程成爲可能,您可以將這些內容複製到源代碼控制中,並根據喜好調味。

這裏沒有關於Rails的具體或特殊的事情,只是這是我第一次看到這種技術被廣泛使用。您也可以使用SQL DDL文件對,如001_UP_add_foo_table.sql和001_DOWN_remove_foo_table.sql。其餘的是shell腳本的一個小問題,這個練習留給讀者。

0

在我當前的項目中,我在源代碼管理中有兩件事 - 一個空數據庫的完整轉儲(使用pg_dump -c,因此它具有創建表和索引的所有ddl)以及一個腳本,用於確定哪些版本數據庫,並應用更改/刪除/添加以使其達到當前版本。前者是在我們安裝新網站時運行的,也是在QA開始新一輪測試時運行的,後者在每次升級時運行。當您進行數據庫更改時,您需要更新這兩個文件。

0

使用Grails應用程序時,默認情況下索引存儲在源代碼管理中,因爲您正在定義代表您的域對象的文件內的索引定義。只是提供「Grails」視角作爲參考。

相關問題