【SQLServer BUG?無圖無真相!】SQLServer分區表的應用

來源:互聯網
上載者:User

  今天晚上兄弟遇到個奇怪的問題,查詢一個表的ID可以顯示出來,查詢其他的列卻查不出來了,如:

 

  我的第一反應是BillCode是char類型的,後面應該帶空格了,所以讓他用BillCode like '%CK201012718200850%' 去查下。

結果被告知沒查到,所以問他要了資料庫地址和帳號密碼,自己去嘗試了,果真如此。

  然後我查詢了所有的資料,這個表一共只有到iID = 12372的記錄。那12372以後的記錄12386怎麼出來的?第一反應是BUG(無知的汗顏。。。)

  然後我用12372實驗了,如下語句,查到了12372是表的臨界點。

  

 

  當時看到這個記錄的時候,我承認我開始蛋疼了。。。我認為這個世界上還是有鬼的!(又為自己的無知汗顏一下。。。)

  說實話,我當時先是想辦法怎麼去解決他,所以很容易就找到了。用 iID<=12372 和 iID>=12373進行了查詢。如下。

  

  兄弟說,是一個方法,但是需要修改很多。所以我們為了發現這一奇特的BUG,而繼續探尋著。。這時兄弟在群裡發了一張圖。他咋發現的,我也不曉得。據說是他們外包的公司提供的。

  

 

  FUNCTION我知道,但這個 Partiton是何意思就不得而知了,上網搜了下,在百度文檔裡看到了“分區表”三個字,在這就恍然大悟了。原來一切都是這個“函數”在作怪。

  在文檔上有這麼一句話。

  

  在MSDN查詢Partition的資料 用了一個T-SQL語句查到了根本。

  

SELECT * FROM sys.partition_functions

  看到了這個造孽的分區,直接刪除搞定。

DROP PARTITION FUNCTION xBillIndexCust

 

 

  下面是別人整理的一些分區表的建立,合并,刪除,查詢的一些操作,在這做個備份吧。看部落格園沒有分區表的相關資料。

 

  

--=========================================-- 轉換為分區表--=========================================-- 1. 建立分區函數--    a. 適用於儲存曆史存檔記錄的分區表的分區函數DECLARE @dt datetimeSET @dt = '20020101'CREATE PARTITION FUNCTION PF_HistoryArchive(datetime)AS RANGE RIGHTFOR VALUES(    @dt,    DATEADD(Year, 1, @dt)) --    b. 適用於儲存記錄的分區表的分區函數--DECLARE @dt datetimeSET @dt = '20000101'CREATE PARTITION FUNCTION PF_History(datetime)AS RANGE RIGHTFOR VALUES(    @dt,DATEADD(Month, 1, @dt),DATEADD(Month, 2, @dt),DATEADD(Month, 3, @dt),DATEADD(Month, 4, @dt),DATEADD(Month, 5, @dt),DATEADD(Month, 6, @dt),DATEADD(Month, 7, @dt),DATEADD(Month, 8, @dt),DATEADD(Month, 9, @dt),DATEADD(Month, 10, @dt),DATEADD(Month, 11, @dt),DATEADD(Month, 12, @dt))GO -- 2. 建立分區架構--    a. 適用於儲存曆史存檔記錄的分區表的分區架構CREATE PARTITION SCHEME PS_HistoryArchiveAS PARTITION PF_HistoryArchiveTO([PRIMARY], [PRIMARY], [PRIMARY]) --    b. 適用於儲存記錄的分區表的分區架構CREATE PARTITION SCHEME PS_HistoryAS PARTITION PF_HistoryTO([PRIMARY], [PRIMARY],    [PRIMARY], [PRIMARY], [PRIMARY],    [PRIMARY], [PRIMARY], [PRIMARY],    [PRIMARY], [PRIMARY], [PRIMARY],    [PRIMARY], [PRIMARY], [PRIMARY])GO -- 3. 刪除索引--    a. 刪除儲存曆史存檔記錄的表中的索引DROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ProductIDDROP INDEX Production.TransactionHistoryArchive.IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID --    b. 刪除儲存記錄的表中的索引DROP INDEX Production.TransactionHistory.IX_TransactionHistory_ProductIDDROP INDEX Production.TransactionHistory.IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineIDGO -- 4. 轉換為分區表--    a. 將儲存曆史存檔記錄的錶轉換為分區表ALTER TABLE Production.TransactionHistoryArchive    DROP CONSTRAINT PK_TransactionHistoryArchive_TransactionID    WITH(        MOVE TO PS_HistoryArchive(TransactionDate)) --    b.將儲存記錄的錶轉換為分區表ALTER TABLE Production.TransactionHistory    DROP CONSTRAINT PK_TransactionHistory_TransactionID    WITH(        MOVE TO PS_History(TransactionDate))GO -- 5. 恢複主鍵--    a. 恢複儲存曆史存檔記錄的分區表的主鍵ALTER TABLE Production.TransactionHistoryArchive    ADD CONSTRAINT PK_TransactionHistoryArchive_TransactionID        PRIMARY KEY CLUSTERED(            TransactionID,            TransactionDate) --    b. 恢複儲存記錄的分區表的主鍵ALTER TABLE Production.TransactionHistory    ADD CONSTRAINT PK_TransactionHistory_TransactionID        PRIMARY KEY CLUSTERED(            TransactionID,            TransactionDate)GO-- 6. 恢複索引--    a. 恢複儲存曆史存檔記錄的分區表的索引CREATE INDEX IX_TransactionHistoryArchive_ProductID    ON Production.TransactionHistoryArchive(        ProductID) CREATE INDEX IX_TransactionHistoryArchive_ReferenceOrderID_ReferenceOrderLineID    ON Production.TransactionHistoryArchive(        ReferenceOrderID,        ReferenceOrderLineID) --    b. 恢複儲存記錄的分區表的索引CREATE INDEX IX_TransactionHistory_ProductID    ON Production.TransactionHistory(        ProductID) CREATE INDEX IX_TransactionHistory_ReferenceOrderID_ReferenceOrderLineID    ON Production.TransactionHistory(        ReferenceOrderID,        ReferenceOrderLineID)GO-- 7. 查看分區表的相關資訊SELECT    SchemaName = S.name,    TableName = TB.name,    PartitionScheme = PS.name,    PartitionFunction = PF.name,    PartitionFunctionRangeType = CASE            WHEN boundary_value_on_right = 0 THEN 'LEFT'            ELSE 'RIGHT' END,    PartitionFunctionFanout = PF.fanout,    SchemaID = S.schema_id,    ObjectID = TB.object_id,    PartitionSchemeID = PS.data_space_id,    PartitionFunctionID = PS.function_idFROM sys.schemas S    INNER JOIN sys.tables TB        ON S.schema_id = TB.schema_id    INNER JOIN sys.indexes IDX        on TB.object_id = IDX.object_id            AND IDX.index_id < 2    INNER JOIN sys.partition_schemes PS        ON PS.data_space_id = IDX.data_space_id    INNER JOIN sys.partition_functions PF        ON PS.function_id = PF.function_idGO --=========================================-- 移動分區表資料--=========================================-- 1. 為儲存曆史存檔記錄的分區表增加分區, 並接受從記錄分區表移動過來的資料--    a. 修改分區架構, 增加用以接受新分區的檔案組ALTER PARTITION SCHEME PS_HistoryArchiveNEXT USED [PRIMARY] --    b. 修改分區函數, 增加分區用以接受從記錄分區表移動過來的資料DECLARE @dt datetimeSET @dt = '20030901'ALTER PARTITION FUNCTION PF_HistoryArchive()SPLIT RANGE(@dt) --    c. 將記錄表中的到期資料移動到曆史存檔記錄表中ALTER TABLE Production.TransactionHistory    SWITCH PARTITION 2        TO Production.TransactionHistoryArchive PARTITION $PARTITION.PF_HistoryArchive(@dt) --    d. 將接受到的資料與原來的分區合并ALTER PARTITION FUNCTION PF_HistoryArchive()MERGE RANGE(@dt)GO -- 2. 將儲存記錄的分區表中不包含資料的分區刪除, 並增加新的分區以接受新資料--    a. 合并不包含資料的分區DECLARE @dt datetimeSET @dt = '20030901'ALTER PARTITION FUNCTION PF_History()MERGE RANGE(@dt) --    b.  修改分區架構, 增加用以接受新分區的檔案組ALTER PARTITION SCHEME PS_HistoryNEXT USED [PRIMARY] --    c. 修改分區函數, 增加分區用以接受新資料SET @dt = '20041001'ALTER PARTITION FUNCTION PF_History()SPLIT RANGE(@dt)GO  --=========================================-- 清除曆史存檔記錄中的到期資料--=========================================-- 1. 建立用於儲存到期的曆史存檔資料的表CREATE TABLE Production.TransactionHistoryArchive_2001_temp(    TransactionID int NOT NULL,    ProductID int NOT NULL,    ReferenceOrderID int NOT NULL,    ReferenceOrderLineID int NOT NULL        DEFAULT ((0)),    TransactionDate datetime NOT NULL        DEFAULT (GETDATE()),    TransactionType nchar(1) NOT NULL,    Quantity int NOT NULL,    ActualCost money NOT NULL,    ModifiedDate datetime NOT NULL        DEFAULT (GETDATE()),    CONSTRAINT PK_TransactionHistoryArchive_2001_temp_TransactionID        PRIMARY KEY CLUSTERED(            TransactionID,            TransactionDate)) -- 2. 將資料從曆史存檔記錄分區表移動到第步建立的表中ALTER TABLE Production.TransactionHistoryArchive    SWITCH PARTITION 1        TO Production.TransactionHistoryArchive_2001_temp -- 3. 刪除不再包含資料的分區DECLARE @dt datetimeSET @dt = '20020101'ALTER PARTITION FUNCTION PF_HistoryArchive()MERGE RANGE(@dt) -- 4. 修改分區架構, 增加用以接受新分區的檔案組ALTER PARTITION SCHEME PS_HistoryArchiveNEXT USED [PRIMARY] -- 5. 修改分區函數, 增加分區用以接受新資料SET @dt = '20040101'ALTER PARTITION FUNCTION PF_HistoryArchive()SPLIT RANGE(@dt)

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.