SQL - Temp-Tabelle: Speichern aller Spalten in temporären Tabelle im Vergleich zu nur Primärschlüssel

stimmen
2

Ich müsste eine temporäre Tabelle für Paging-Zwecke erstellen. Ich würde alle Datensätze in eine temporäre Tabelle werden die Auswahl und führen Sie dann die weitere Verarbeitung mit ihm.

Ich frage mich, welche der folgenden ist ein besserer Ansatz:

1) Wählen Sie alle Spalten meiner Primärtabelle in die Temp-Tabelle und dann die Zeilen in der Lage zu wählen ich brauchen würde,

ODER

2) Wählen Sie nur die Primärschlüssel der Primärtabelle in die Temp-Tabelle und dann mit der primären Tabelle Beitritt später?

Gibt es eine Größe Überlegung bei dem mit Ansatz 1 im Vergleich zu Ansatz 2 zu arbeiten?

[BEARBEITEN]

Ich frage, weil ich den ersten Ansatz getan hätte, aber VERFAHREN suchen [dbo]. [Aspnet_Membership_FindUsersByName], das mit ASP.NET-Mitgliedschaft enthalten war, tun sie Ansatz 2

[EDIT 2]

Mit Menschen, die keinen Zugang zu der gespeicherten Prozedur:

  -- Insert into our temp table
INSERT IGNORE  INTO #PageIndexForUsers (UserId)
    SELECT u.UserId
    FROM   dbo.aspnet_Users u, dbo.aspnet_Membership m
    WHERE  u.ApplicationId = @ApplicationId AND m.UserId = u.UserId AND u.LoweredUserName LIKE LOWER(@UserNameToMatch)
    ORDER BY u.UserName


SELECT  u.UserName, m.Email, m.PasswordQuestion, m.Comment, m.IsApproved,
        m.CreateDate,
        m.LastLoginDate,
        u.LastActivityDate,
        m.LastPasswordChangedDate,
        u.UserId, m.IsLockedOut,
        m.LastLockoutDate
FROM   dbo.aspnet_Membership m, dbo.aspnet_Users u, #PageIndexForUsers p
WHERE  u.UserId = p.UserId AND u.UserId = m.UserId AND
       p.IndexId >= @PageLowerBound AND p.IndexId <= @PageUpperBound
ORDER BY u.UserName
Veröffentlicht am 09/12/2008 um 16:01
quelle vom benutzer
In anderen Sprachen...                            


5 antworten

stimmen
2

Eine Tabelle Variable würde über eine temporäre Tabelle bevorzugt werden, wenn sein in Ihrer Einschränkung.

Option 2 würde weniger Ressourcen verwenden, weil es weniger Datenduplizierung ist.

Tonys Punkte darüber ein zerstörendes Lesen ist wirklich etwas, das man in Erwägung ziehen sollte.

Können Sie erklären, wie Sie ‚Paging‘ mit temporären Tabellen sind? Es ist nicht eine Paging-Methode, die ich bin vertraut mit.

EDIT: Nach dem in Ihrem Beitrag bearbeiten suchen, sollten Sie auf jeden Fall eine Tabelle Variable in diesem Fall verwendet werden. Seine weniger zur Reinigung und man wird nicht die Tempdb ausblasen so viel.

Auch seine Art unklar, was diese temporäre Tabelle profitieren gibt. Wenn Ihr Ziel ist es einen Benutzer den Zugriff auf ein Objekt / applicaiton zu stoppen ist, warum dann fügen Sie den Teil über „nur eingeschränkt, wenn auf dieser speziellen Datentabelle Seite“ zu sein. Es scheint Art Loch-y aus Sicht der Sicherheit.

Die temporäre Tabelle kann so ziemlich auch beseitigt werden, da sie aus den gleichen Tabellen auswählt.

Beantwortet am 09/12/2008 um 16:15
quelle vom benutzer

stimmen
1

Mit Ansatz 1 können die Daten in der temporären Tabelle mit den realen Daten aus Schritt sein, das heißt, wenn andere Sitzungen Änderungen an die realen Daten zu machen. Dies kann in Ordnung sein, wenn Sie nur eine Momentaufnahme der aufgenommenen Daten zu einem bestimmten Zeitpunkt sehen, wäre aber gefährlich sein, wenn Sie auch die reale Tabelle Änderungen Aktualisierung beruhten auf die temporäre Kopie gemacht.

Beantwortet am 09/12/2008 um 16:04
quelle vom benutzer

stimmen
0

Eine Alternative zum Paging (die Art und Weise meiner Firma tut es) ist CTE zu verwenden.

Schauen Sie sich dieses Beispiel von http://softscenario.blogspot.com/2007/11/sql-2005-server-side-paging-using-cte.html

CREATE PROC GetPagedEmployees (@NumbersOnPage INT=25,@PageNumb INT = 1)
AS BEGIN

WITH AllEmployees AS
(SELECT ROW_NUMBER() OVER (Order by [Person].[Contact].[LastName]) AS RowID,
[FirstName],[MiddleName],[LastName],[EmailAddress] FROM [Person].[Contact])

SELECT [FirstName],[MiddleName],[LastName],[EmailAddress]
FROM AllEmployees WHERE RowID BETWEEN
((@PageNumb - 1) * @NumbersOnPage) + 1 AND @PageNumb * NumbersOnPage
ORDER BY RowID
Beantwortet am 09/07/2009 um 09:40
quelle vom benutzer

stimmen
0

Denken Sie an es auf diese Weise. Angenommen, Ihre Abfrage genügend Datensätze zurückgeben würde 1000 Seiten zu füllen. Wie viele Benutzer denken Sie, wäre wirklich an all diesen Seiten aussehen? Durch die Rückgabe nur die IDs, kehren Sie nicht viele Informationen können Sie oder müssen möglicherweise nicht sehen. So soll es auf Netzwerk- und Server-Ressourcen sparen. Und wenn sie wirklich durch viele Seiten gehen Sie, es wäre genug Zeit in Anspruch nehmen, dass die Daten Details in der Tat aufgefrischt werden müssen möglicherweise.

Beantwortet am 09/12/2008 um 21:49
quelle vom benutzer

stimmen
0

Das ist genau der Ansatz, den ich für Paging auf dem Server verwenden,

Erstellen Sie eine Tabelle Variable (warum der Aufwand für die Transaktionsprotokollierung entstehen?) Mit nur den Schlüsselwerten. (Die Tabelle wird mit einer AUTONUM Spalte Identität Primärschlüssel -. Diese rownum sein)

Schlüssel in die Tabelle einfügen basierend auf den Sortier- / Filterkriterien .. Identitätsspalte ist jetzt eine Zeilennummer, die für das Paging verwendet werden kann.

Wählen Sie aus der Tabelle variabel verbunden mit anderen Tabellen mit realen Daten erforderlich, Anmeldedatum auf Schlüsselwert,

Where RowNum Between ((PageNumber-1) * PageSize) + 1 And PageNumber * PageSize
Beantwortet am 09/12/2008 um 16:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more