2010-06-21 42 views
2

INFORMIX-SE 7.32:是否有更好/更快的方法在列中查找具有最大值的行?

我有一個大約5000個零點的交易表。 transaction.ticket_number [INT]是每次更新特定行時使用下一個可用連續故障單編號更新的列。該列是唯一索引的。我目前使用下面的SELECT語句查找最大(transaction.ticket_num):

SELECT MAX(transaction.ticket_number) FROM transaction; 

由於正在更新的行聚集acording到transaction.fk_id [INT],它連接到客戶。 pk_id [SERIAL],行不在物理上位於事務表的末尾,而是位於屬於每個特定客戶的事務行組中。我選擇聚集屬於每個客戶的交易,因爲當我滾動瀏覽每個客戶交易時,響應時間更快。用上面的查詢有沒有更快的方法來查找max(transaction.ticket_number)?..「事務(ticket_number)下降的唯一索引」會改進訪問還是索引從開始到結束都被不相關地完全遍歷?

回答

1

在現代機器上只有5000行的表上,您不可能測量各種技術的性能差異,尤其是在我認爲您正面臨的單用戶場景中。即使5000行都處於最大允許的大小(略低於32 KB),您將處理160 MB的數據,這些數據可以很容易地放入機器的緩存中。在實踐中,我確定你的行數要小得多,而且你永遠不需要緩存中的所有數據。

除非您有可證明的性能問題,否則請使用票號列上的索引並依靠服務器(Informix SE)來完成其工作。如果您有可證明的問題,請從SET EXPLAIN輸出中顯示查詢計劃。但是,您可以調整SE性能的程度有很大的限制 - 這是安裝和運行技術,對調整的要求最低。

我不確定Informix SE是否支持Informix Dynamic Server支持的'FIRST n'(又名'TOP n')表示法;我不相信。

+0

是的,單用戶,rowsize = 512,不支持SE中的FIRST。可以ISQL(即執行&ACE)使用IDS而不是SE?..我的應用程序是單用戶,儘管使用大於500K的歷史DSS事務表位於單獨的數據庫中,但您永遠不知道客戶端何時可能需要分佈式多用戶數據庫他們所有的當鋪分支。 – 2010-06-21 18:54:38

+0

@Frank:是的,ISQL可以很好地與IDS協同工作,但必須注意的是,Perform不能與分段表一起使用,除非它們是使用WITH ROWIDS子句創建的。但是,對於直接遷移,你不會有碎片表,然後你會沒事的。 – 2010-06-21 19:49:22

+0

這真是太棒了!我正在計劃'由於表達式造成的碎片customer.date_last_activity <今天 - 365在dbsp_inactive_customers'中,所以我想在我的reorg proc的'CREATE TABLE customer'語句中包含'WITH ROWIDS'。 – 2010-06-23 15:30:21

1

由於空列等因素的影響,使用索引,等等,你可以經常發現下面的速度會更快,但通常只negligably ...

SELECT TOP 1 ticket_number FROM transaction ORDER BY ticket_number DESCENDING 

我也不確定是否你實際上在[ticket_number]上有一個索引?或者你是否只有一個UNIQUE約束?一個約束無助於確定一個MAX,但一個INDEX將會。

在一個索引與TICKET_NUMBER作爲第一個可轉位列中存在的事件:
- 索引查找/查找可能會被使用,不需要在所有

掃描其他值在事件的INDEX存在與TICKET_NUMBER不能作爲第一個可轉位柱:
- 可能會發生索引掃描,檢查索引

每一個唯一的入口在沒有可用的索引存在的事件:
- 整個表會掃描

+0

如果我在同一個表中的不同列上有多個索引,那麼我創建每個索引的順序是否重要?在SE中,我注意到屬於表的所有索引都存儲在一個IDX文件中,如果創建更多索引,則這個sinle文件會增長。 – 2015-03-18 19:48:46

相關問題