Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Ansichten in SQL Server

Einführung

Eine Ansicht in SQL Server ist eine virtuelle tabellenähnliche Struktur, die auf der Ergebnismenge einer SQL-Anweisung basiert. An der Oberfläche ähnelt eine Ansicht einer Tabelle mit der Signaturstruktur von Zeilen und Spalten. Diese Zeilen und Spalten stammen jedoch aus Tabellen, auf die in der Abfrage verwiesen wird, die die Ansicht definiert.

Wir verwenden Ansichten, um uns auf die Betonsäulen für die Zwecke zu konzentrieren, für die sie erstellt wurden. Ansichten können auch aus Sicherheitsgründen dienen. Sie filtern Spalten in den zugrunde liegenden Tabellen heraus, die man bestimmten Benutzern nicht sichtbar machen möchte. Betrachtet Filterspalten wie eine WHERE-Klausel Zeilen filtert.

Ein weiterer Grund für Ansichten ist die Einfachheit. Sie aggregieren Spalten aus mehreren verschiedenen Tabellen und erzeugen ein allgemeines Erscheinungsbild, das wie eine einzelne Tabelle aussieht.

Arten von Ansichten

Einfache benutzerdefinierte Ansichten lassen sich einfach erstellen. Der Vorgang ähnelt dem Schreiben von Abfragen, die auf eine oder mehrere Tabellen verweisen.

  • Indizierte Ansichten sind solche, die wie eine Tabelle materialisiert oder gespeichert wurden. Indizierte Ansichten können die Leistung von Abfragen verbessern, die viele Zeilen aggregieren. Sie sind jedoch nicht geeignet, wenn zugrunde liegende Tabellen häufig aktualisiert werden.
  • Partitionierte Ansichten verbinden horizontal partitionierte Daten aus Tabellen lokal (innerhalb derselben Instanz) oder über viele hinweg mithilfe von Verbindungsservern.
  • Systemansichten sind die allgemeinen Strukturen, die SQL Server verwendet, um die Katalogmetadaten bereitzustellen. Systemansichten sind die meisten dieser Strukturen, die man abfragt, um die Leistung zu beheben oder eine SQL Server-Instanz zu untersuchen.

Erstellen einer Ansicht aus einer Tabelle

Schauen Sie sich das Beispiel in Listing 1 an. Die erste Anweisung gibt ALLE Datensätze in der Tabelle Purchasing.PurchaseOrders zurück (1a), während die zweite Abfrage nur wenige Spalten zurückgibt (1b).

Mit der zweiten Abfrage können wir eine Ansicht erstellen, die dieselbe Ergebnismenge wie (1b) zurückgibt. Wenn wir dies tun, können wir eine Ansicht abfragen, um die gewünschte Ausgabe zu erhalten. Somit vereinfachen wir die Abfrage für einen Endbenutzer.

-- Listing 1: Creating a Basic User-Defined View
-- 1a

SELECT * FROM
  Purchasing.PurchaseOrders;

-- 1b
SELECT 
  PurchaseOrderID
  , SupplierID
  , OrderDate
  , ExpectedDeliveryDate
  FROM Purchasing.PurchaseOrders;

-- 1c
CREATE VIEW Purchasing.QuickOrders 
  AS
SELECT 
  PurchaseOrderID
  , SupplierID
  , OrderDate
  , ExpectedDeliveryDate
  FROM Purchasing.PurchaseOrders;

-- 1d
SELECT * FROM Purchasing.QuickOrders ;

Erstellen einer Ansicht aus zwei Tabellen

Mit JOINs können wir Daten aus zwei oder mehr Tabellen abrufen, die eine Beziehung haben. Mithilfe von Views können wir den Zugriff auf solche Daten vereinfachen.

Listing 2 (2a) zeigt einen JOIN zwischen Purchasing.PurchaseOrders und Purchasing.PurchaseOrderLines. Wir können aus diesem JOIN eine Ansicht erstellen, die es uns ermöglicht, dieselben Daten mithilfe einer Abfrage abzurufen, wie in (2c) gezeigt.

-- Listing 2: Creating a View from Two Tables
-- 2a
  SELECT 
  po.PurchaseOrderID
  , po.SupplierID
  , po.OrderDate
  , po.ExpectedDeliveryDate
    , pol.Description
    , pol.ExpectedUnitPricePerOuter
  FROM Purchasing.PurchaseOrders po
  INNER JOIN Purchasing.PurchaseOrderLines pol
  ON po.PurchaseOrderID=pol.PurchaseOrderID;

-- 2b
  CREATE VIEW Purchasing.DetailedOrders
    AS
  SELECT 
  po.PurchaseOrderID
  , po.SupplierID
  , po.OrderDate
  , po.ExpectedDeliveryDate
    , pol.Description
    , pol.ExpectedUnitPricePerOuter
  FROM Purchasing.PurchaseOrders po
  INNER JOIN Purchasing.PurchaseOrderLines pol
  ON po.PurchaseOrderID=pol.PurchaseOrderID;

-- 2c
  SELECT * FROM Purchasing.DetailedOrders;

Datenbankübergreifende Ansicht erstellen

Durch die mehrteilige Benennung können wir auf Tabellen in einer anderen Datenbank verweisen. Daher können wir JOINs über die Datenbanken hinweg durchführen und Ansichten erstellen, die sich über Datenbanken erstrecken. Dies ist hilfreich für bestimmte Anwendungen, die ihre Daten über Datenbanken in derselben SQL Server-Instanz verteilen.

Listing 3 zeigt einen ähnlichen Fall wie Listing 2, jedoch mit einem Unterschied:Wir fügen der JOIN-Abfrage eine dritte Tabelle aus einer anderen Datenbank hinzu. Beachten Sie, dass wir einen LEFT OUTER JOIN verwenden müssen, da zwischen den Tabellen in beiden Datenbanken keine echte Beziehung besteht. Hier verwenden wir es nur, um das Erstellen einer VIEW zu veranschaulichen, die sich über verschiedene Datenbanken erstreckt.

Wir haben einen Alias ​​in der CREATE VIEW-Anweisung eingeführt, da wir Spalten aus zwei verschiedenen Tabellen mit demselben Namen haben. Wir müssen diese Spalten in solchen Fällen unterscheiden.

  -- Listing 3: Creating a View Across Databases
  -- 3a
  SELECT 
  po.PurchaseOrderID
  ,po.SupplierID
  ,po.OrderDate
  ,po.ExpectedDeliveryDate
    ,pol.Description
    ,pol.ExpectedUnitPricePerOuter
    ,so.orderid
    ,so.custid
    ,so.orderdate
  FROM Purchasing.PurchaseOrders po
  INNER JOIN Purchasing.PurchaseOrderLines pol
  ON po.PurchaseOrderID=pol.PurchaseOrderID
  LEFT OUTER JOIN TSQLV4.Sales.Orders so
  ON po.PurchaseOrderID=so.orderid;

-- 3b
  CREATE VIEW Purchasing.DetailedOrdersDistributed
    AS
  SELECT 
  po.PurchaseOrderID
  ,po.SupplierID
  ,po.OrderDate
  ,po.ExpectedDeliveryDate
    ,pol.Description
    ,pol.ExpectedUnitPricePerOuter
    ,so.orderid
    ,so.custid
    ,so.orderdate AS OrdersOrderDate
  FROM Purchasing.PurchaseOrders po
  INNER JOIN Purchasing.PurchaseOrderLines pol
  ON po.PurchaseOrderID=pol.PurchaseOrderID
  LEFT OUTER JOIN TSQLV4.Sales.Orders so
  ON po.PurchaseOrderID=so.orderid;

-- 3c
  SELECT * FROM Purchasing.DetailedOrdersDistributed;

Schauen Sie sich Abbildung 1 an. Sie zeigt das Ergebnis der Ausführung von Listing 3(3c). Beachten Sie, dass die letzten drei Spalten wie TSQLV4.Sales.Orders leer sind Tabelle enthält keine Zeilen, die der JOIN-Bedingung entsprechen.

Instanzübergreifende Ansicht erstellen

Wir können die letzte Anweisung erweitern, indem wir eine Tabelle einführen, die vollständig in einer anderen Instanz lebt.

Um dies zu erreichen, müssen wir zunächst einen Linked Server erstellen. Wir machen das mit dem Code ähnlich dem in Listing 4.

-- Listing 4: Linked Server

USE [master]
GO

EXEC master.dbo.sp_addlinkedserver @server = N'IGIRI01\SQLEXPRESS', @srvproduct=N'SQL Server'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'IGIRI01\SQLEXPRESS',@useself=N'True',@locallogin=NULL,@rmtuser=NULL,@rmtpassword=NULL
GO

Beachten Sie, wie wir die externe Tabelle mit einem vierteiligen Namen adressieren:

-- Listing 5: Creating a View Across Instances
-- 5a

CREATE VIEW Purchasing.DetailedOrdersExternal
    AS
  SELECT 
  po.PurchaseOrderID
  ,po.SupplierID
  ,po.OrderDate
  ,po.ExpectedDeliveryDate
    ,pol.Description
    ,pol.ExpectedUnitPricePerOuter
    ,ipol.StockItemID
    ,ipol.LastEditedWhen
  FROM Purchasing.PurchaseOrders po
  INNER JOIN Purchasing.PurchaseOrderLines pol
  ON po.PurchaseOrderID=pol.PurchaseOrderID
  INNER JOIN [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
  ON po.PurchaseOrderID=ipol.PurchaseOrderID;

-- 5b
SELECT * FROM Purchasing.DetailedOrdersExternal;

Einschließen von Funktionen in Ansichten

Da Ansichten im Wesentlichen Abfragen sind, können wir auf sie fast alles anwenden, was wir mit normalen Abfragen tun. Wir können Funktionen, WHERE-Klauseln, CASE-Ausdrücke, Aliase usw. einschließen.

Die ORDER BY-Klausel ist jedoch nicht zulässig, außer Sie verwenden den „TOP 100-Hack“. Listing 6 bis 9 veranschaulichen die Verwendung dieser Klauseln in Views.

-- Listing 6: Creating a View with a Function
CREATE VIEW Purchasing.DetailedOrdersComplex
    AS
  SELECT 
  ipol.PurchaseOrderID
  ,ipol.Description
  ,ipol.ExpectedUnitPricePerOuter
  ,ipol.StockItemID
  ,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
  FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
-- Listing 7: Creating a View with a WHERE Clause
  CREATE VIEW Purchasing.DetailedOrdersComplexFilt
    AS
  SELECT 
  ipol.PurchaseOrderID
  ,ipol.Description
  ,ipol.ExpectedUnitPricePerOuter
  ,ipol.StockItemID
  ,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
  FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
    WHERE   ipol.PurchaseOrderID<10;
  -- Listing 8: Creating a View a TOP Clause
  CREATE VIEW Purchasing.DetailedOrdersComplexTop
    AS
  SELECT TOP 10
  ipol.PurchaseOrderID
  ,ipol.Description
  ,ipol.ExpectedUnitPricePerOuter
  ,ipol.StockItemID
  ,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
  FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol
      -- Listing 9: Creating a View with a CASE Expression
  CREATE VIEW Purchasing.DetailedOrdersComplexTop
    AS
  SELECT TOP 10
    CASE 
  ipol.PurchaseOrderID
    WHEN 1 THEN 'First Order'
    WHEN 2 THEN 'Second Order'
    END PurchaseOrder
  ,ipol.Description
  ,ipol.ExpectedUnitPricePerOuter
  ,ipol.StockItemID
  ,CONVERT(VARCHAR, LastEditedWhen, 113) AS LastEditedLongDate
  FROM [IGIRI01\SQLEXPRESS].[WWI].[Purchasing].[PurchaseOrderLines] ipol

Indizierte Aufrufe

Wir haben weiter oben in diesem Artikel auf indizierte Ansichten verwiesen. Indizierte Ansichten können die Leistung verbessern, außer in den Fällen, in denen zugrunde liegende Tabellen schreibintensiv sind. SQL Server erfordert, dass bestimmte SET-Optionen aktiviert sind, bevor indizierte Ansichten erstellt oder bestimmte Operationen an ihnen ausgeführt werden können.

Die WITH SCHEMABINDING-Klausel sollte verwendet werden, wenn eine View erstellt wird, um ihr einen Index hinzuzufügen. Diese Klausel ordnet die Ansicht strikt den zugrunde liegenden Objekten zu. Daher können solche Objekte nicht gelöscht werden.

-- Listing 10: Creating an Indexed View
SET ANSI_PADDING, ANSI_WARNINGS, CONCAT_NULL_YIELDS_NULL, ARITHABORT, QUOTED_IDENTIFIER, ANSI_NULLS ON;

  CREATE VIEW Purchasing.DetailedOrdersIndexed
    WITH SCHEMABINDING
    AS
  SELECT 
  po.PurchaseOrderID
  ,po.SupplierID
  ,po.OrderDate
  ,po.ExpectedDeliveryDate
  FROM Purchasing.PurchaseOrders po;

CREATE UNIQUE CLUSTERED INDEX IX_ID
   ON Purchasing.DetailedOrdersIndexed (PurchaseOrderID);

Schlussfolgerung

In diesem Artikel haben wir Ansichten auf einer gewissen Detailebene untersucht. Wir haben View-Typen kurz behandelt und einige Beispiele für benutzerdefinierte Views gegeben und wie wir JOINs verwendet haben, um Views zu realisieren, die von vielen Tabellen abhängen. Wir haben auch komplexe Ansichten behandelt, die sowohl Funktionen als auch indizierte Ansichten enthalten.

Referenzen

  1. Aufrufe
  2. Indizierte Ansichten
  3. Indizierte Ansichten in SQL Server erstellen