Użyliśmy User-Defined Table Types do przekazania listy liczb całkowitych do naszych procedur składowanych.Wydajność typów tabel zdefiniowanych przez użytkownika w SQL Server
Następnie używamy ich do dołączania do innych tabel w naszych przechowywanych zapytaniach proc.
Na przykład:
CREATE PROCEDURE [dbo].[sp_Name]
(
@Ids [dbo].[OurTableType] READONLY
)
AS
SET Nocount ON
SELECT
*
FROM
SOMETABLE
INNER JOIN @Ids [OurTableType] ON [OurTableType].Id = SOMETABLE.Id
Widzieliśmy bardzo słabą wydajność podczas korzystania z tego większych zbiorów danych.
Jednym ze sposobów, w jaki przyspieszyliśmy działania, jest zrzucenie zawartości do tymczasowego stołu i połączenie zamiast tego.
Na przykład:
CREATE PROCEDURE [dbo].[sp_Name]
(
@Ids [dbo].[OurTableType] READONLY
)
AS
SET Nocount ON
CREATE TABLE #TempTable(Id INT)
INSERT INTO #TempTable
SELECT Id from @Ids
SELECT
*
FROM
SOMETABLE
INNER JOIN #TempTable ON #TempTable.Id = SOMETABLE.Id
DROP TABLE #TempTable
ta ma znacznie poprawić wydajność, ale chciałem uzyskać jakieś opinie na temat tego podejścia i jakiekolwiek inne konsekwencje nie są brane pod uwagę. Pomocne może być również wyjaśnienie, dlaczego poprawia to wydajność.
N.B. czasami możemy potrzebować przekazać więcej niż liczbę całkowitą, dlatego nie używamy listy rozdzielanej przecinkami lub czegoś podobnego.
pytanie: czy przechodzisz na tę listę z warstwy aplikacji, czy innego sproca? istnieje wiele artykułów na temat tabel tymczasowych a zmiennych tabel. http: // stackoverflow.com/questions/27894/whats-the-difference-between-a-temp-table-and-table-variable-in-sql-server i http://www.sql-server-performance.com/2007/temp- tables-vs-variables/ – Jeremy
Tak, przekazujemy listę z warstwy aplikacji. Dzięki za artykuły. – KMB