我有一個MS SQL 2008數據庫,用於存儲創建加權無向圖的數據。數據被存儲在表中具有以下結構:帶有動態表名或重新設計的SQL語句?
[id1] [int] NOT NULL,
[id2] [int] NOT NULL,
[weight] [float] NOT NULL
其中[ID1]和[ID2]表示兩個連接節點和[重量]連接這些節點的邊的權重。
有幾種不同的算法,從一些基礎數據創建圖形。對於每種算法,我想將圖形數據存儲在單獨的表中。這些表都具有相同的結構(如上所示)並使用指定的前綴(類似性ALB,文章類似性,類似性,類別...),因此我可以將它們識別爲圖表。
客戶端程序可以選擇哪個表格(即通過哪個算法創建圖表)用於進一步的操作。
訪問數據由存儲過程完成。因爲我有不同的表,我需要使用一個變量的tablename例如爲:
SELECT id1, id2, weight FROM @tableName
這不起作用,因爲SQL不支持在聲明變量表名。我已經在網上搜索和對這個問題的所有解決方案使用動態SQL EXEC()語句如:
EXEC('SELECT id1, id2, weight FROM ' + @tableName)
因爲其中大部分人提到,這使得容易出現SQL注入,我想它的聲明避免。一個簡單的重新設計的想法是將所有不同的圖表放在一張表中,並添加一列來標識不同的圖表。
[graphId] [int] NOT NULL,
[id1] [int] NOT NULL,
[id2] [int] NOT NULL,
[weight] [float] NOT NULL
我對這個解決方案的問題是,根據使用的算法(高達500萬條目),圖形可能非常大。我需要通過索引表(id1,id2)和(id2,id1)。現在把它們放在一張大桌子裏會讓表格變得更加龐大(並且要求更慢)。由於活躍的指標,添加新圖表會導致性能不佳。刪除圖表不能被TRUNCATE做了,我會需要使用
DELETE * FROM myTable WHERE [email protected]
與大表表現得非常糟糕,並創建一個非常大的日誌文件(在圖中是足夠大的,這將超過我的磁盤空間) 。所以我想保留每張圖的獨立表。
任何建議如何通過查找參數化表名或重新設計數據庫結構的方法來解決這些問題,同時避免上述問題?
我喜歡錶n最大限度地檢查,認爲我會這樣。我看了一下分區表 - 一個問題是我不能使用截斷來刪除整個圖表(就像IronGoofy提到的那樣)。另外,我將看看如何使用sp_executesql,因爲它支持參數替換和執行計劃(以供重用)。 – Aaginor 2009-11-24 12:51:02
在Oracle中,可以截斷分區表中的單個分區(ALTER TABLE foo TRUNCATE PARTITION bar;)。在SQL-Server中,你必須將數據從分區移動到一個新的表格中,然後你可以放下......怪異的...... – 2009-11-24 13:28:30