多年來,我已閱讀了很多人關於如何從SQL(Microsoft SQL Server,只是讓我們都在同一頁面上)獲得更好性能的意見......查詢。但是,它們似乎都與高性能OLTP安裝程序或數據倉庫OLAP安裝程序(立方體 - 豐滿...)緊密相關。但是,我今天的情況是在2中間,因此我的優柔寡斷。高效Ad-hoc SQL OLAP結構
我有[Contacts],[Sites],[SiteContacts]([Sites]和[Contacts])的聯結表,[SiteTraits]和[ContractTraits]的一般數據庫結構。我與接觸者有約50個聯繫人(在[聯繫人]和[ContactTraits]之間)約50萬個聯繫人,以及約60個與約150個聯繫點相關的站點(大約150個字段([站點]和[SiteTraits之間]) 。基本上這是一個相當大的扁平表或視圖......大多數列是INT,位,CHAR(3),或短VARCHAR(S)。我的問題是,這些列中的很大一部分可用於用戶的即席查詢,並儘可能快地進行,因爲用於此的主UI將成爲網站。我知道最常用的過濾器,但即使對它們進行了大量索引,我認爲這仍然是一個野獸......這些數據是隻讀的,數據在一天中根本不會改變,數據庫只會在預定的停機時間內刷新最新信息。所以我看到這種情況就像一個OLAP數據庫,它具有OLTP數據庫的讀取需求。
我看到3個選項; 1.將表格拆分成更小的可分割單元子查詢所有內容,2.製作一張平坦的表格,然後真正到達索引的城鎮3.創建一個OLAP多維數據集,然後根據我沒有放入的過濾器值對其餘的子查詢作爲立方體尺寸,和。我對OLAP多維數據集並沒有做太多的工作,所以我坦白地不知道這是否是一種選擇,但是從我過去與他們做的事情來看,我認爲這可能是一種選擇。另外,爲了澄清我說的「子查詢所有內容」的含義,而不是在外部選擇上有一個WHERE子句,那麼每個表被引入到查詢中都會有一個(如果適用),然後這些表是INNER JOINed,消除一個非常大的笛卡爾積。至於這個大表的第二個選項,我聽到並且看到了與該方法相沖突的結果,因爲它將節省連接,但同時表掃描需要更長的時間。
想法任何人?我需要分享我正在吸菸嗎?如果每個人都投入2美分,我認爲這可能會變成一個非常好的討論。哦,並且隨時告訴我,如果我是基於OLAP立方體的想法,如果是這樣的話,我也是新手。
在此先感謝任何和所有的意見,並與這種困境,我發現自己的幫助。
我對此有興趣 - 我們對維度進行建模,它可以同時爲包含未知維數的特定查詢提供良好的查詢性能。如果您在已經是維度模型的頂部構建一個立方體,那很好 - 我們只是在RDBMS引擎中使用(非規範化的星型模式)維度模型而沒有任何花哨的OLAP。 – 2010-08-12 23:07:33
此外,如果數據量相對較少(數百萬比數十億),我想可以每天進行幾次完整刷新。從而避免更改數據捕獲或任何此類問題。 – 2010-08-12 23:09:26
我的猶豫與立方體的方法是,有時我只想要一個計數(不同數量的ContactIds說)或者我可能實際上需要返回數據(名稱,地址,位置標題,電話號碼等),這可能潛在地數據庫中除了內部ID和鍵之外的所有字段......我只是使用結果,比如說ContactIds中的獨特列表,在tradionalal t-SQL選擇中就像使用IN或加入非規範化版本數據庫的實際數據是否需要返回,而不僅僅是一個計數? – user418754 2010-08-12 23:54:41