Sql-Server

索引視圖與過濾索引的成本?

  • May 22, 2020

我遇到了以下表格設計,用於以非規範化方式記錄引用:

RecordGUID              uniqueidentifier
DestinationEntity       uniqueidentifier
DestinationRecordGUID   uniqueidentifier

例如,Users對於描述對 的引用的表Countries,我們將有:

RecordGUID                             DestinationEntity                       DestinationRecordGUID   
79282C80-4474-4617-9C40-C21E97F5AC52   3A462EF8-DAB6-4B98-BA1B-FBD957A1737C    5842E524-8C5D-4DEE-A553-0857FB9C12F4
B25DA064-8DAF-4EEB-8894-D540B3A929EA   3A462EF8-DAB6-4B98-BA1B-FBD957A1737C    C2B0AA1A-E688-4E2C-BD5F-16309C496774

因此,3A462EF8-DAB6-4B98-BA1B-FBD957A1737C表示Countries、 while5842E524-8C5D-4DEE-A553-0857FB9C12F4C2B0AA1A-E688-4E2C-BD5F-16309C496774是指Counries表中的記錄。

我們在這裡有很多關係——例如usersto languagescompanies等。而且因為GUID為了加入表格而使用它不是使用者友好的,所以我們為每個關係建立了索引視圖,如下所示:

CREATE VIEW [dbo].[users_countries]
WITH SCHEMABINDING
AS
SELECT [RecordGUID]
     ,[DestinationEntity]
     ,[DestinationRecordGUID]
FROM (the relationship table)
WHERE [DestinationEntity] = '3A462EF8-DAB6-4B98-BA1B-FBD957A1737C';

因此,人們可以輕鬆地將此視圖連接到counties表並對其進行查詢 - 此外,由於使用視圖(沒有展開)並在其上有索引,並非原始表中的所有記錄都被讀取(它更快)。

系統可能有數百個索引視圖,與原始表上的過濾索引相比,我擔心引擎管理它們的成本。我的意思是view只創建這樣的索引:

CREATE INDEX (index_Name) ON (the relationship table)
(
   [RecordGUID]
  ,[DestinationRecordGUID]
)
WHERE [DestinationEntity] = '3A462EF8-DAB6-4B98-BA1B-FBD957A1737C'

我們不再能夠以友好的方式查詢該表,但這會影響性能嗎?

我找不到任何關於索引視圖損害性能的話題——但面對這樣的設計讓我懷疑。

我想知道我們可以說視圖索引的維護和表上的相同索引(如上)是相同的嗎?

這設計太可怕了。您應該有單獨的表和真正的外鍵。要快速修復,請使用索引視圖。如果存在性能問題,請修復設計。

引用自:https://dba.stackexchange.com/questions/267698