La Table de hachage de la Structure de Données dans SQL Server
Depuis quelques jours, j'ai été lire un ebook sur les structures de données et bien, franchement, beaucoup de choses sont déjà parti de ma tête. Juste le temps de les examiner et d'essayer de faire effacer à nouveau. J'ai été en passant par les tables de hachage et obtenir familier avec elle à nouveau. Donc, je sais et entendu, SQL Server utilise des tables de hachage interne et beaucoup de fils de stackoverflow.com et forums.asp.net interrogé sur la création de tables de hachage dans SQL Server comme il stocke temporairement les données. Alors laissez-moi vous donner un exemple que j'ai utilisé dans une procédure stockée à l'aide de la table temporaire: (à Éviter et il est trop long. Juste pour un exemple)
1er:
CREATE PROCEDURE [dbo].[Orders]
@OrderLine int
AS
BEGIN
DECLARE @t1 TABLE(Date1 date,
OrderID VARCHAR(MAX),
EmployeeName VARCHAR(MAX),
DeliveryDate date,
StoreName VARCHAR(MAX),
DeliveryAddress VARCHAR(MAX),
ItemName VARCHAR(MAX),
Quantity FLOAT)
INSERT INTO @t1(Date1, OrderID, EmployeeName, DeliveryDate, StoreName, DeliveryAddress, ItemName, Quantity)
(SELECT DISTINCT
CONVERT(VARCHAR(11), DemandOrder.POCreationDate, 6) AS DemandOrderDate,
DemandOrder.OrderID, EmployeeDetails.EmployeeName,
CONVERT(DATE, DemandOrder.DeliveryDate) AS ExpectedDeliveryDate,
StoreDetails.StoreName,
DemandOrder.DeliveryAddress, Item.ItemName,
DemandOrderLine.Quantity
FROM
DemandOrder
INNER JOIN
DemandOrderLine ON DemandOrder.OrderID = DemandOrderLine.OrderID
INNER JOIN
Item on DemandOrderLine.ItemID=Item.ItemID
INNER JOIN
EmployeeDetails ON EmployeeDetails.EmployeeID = DemandOrder.EmployeeID
INNER JOIN
StoreDetails ON DemandOrderLine.StoreID = StoreDetails.StoreID
WHERE
DemandOrderLine.OrderLine = @OrderLine)
DECLARE @t2 TABLE(Approvedby VARCHAR(MAX))
INSERT INTO @t2(Approvedby)
(SELECT EmployeeDetails.EmployeeName
FROM EmployeeDetails
INNER JOIN DemandOrderLine ON DemandOrderLine.ApprovedBy = EmployeeDetails.EmployeeID)
SELECT DISTINCT
CONVERT(VARCHAR(11), Date1, 6) AS Date,
OrderID, EmployeeName,
CONVERT(VARCHAR(11), DeliveryDate, 6) AS ExpectedDeliveryDate,
StoreName, Approvedby, DeliveryAddress,
ItemName, Quantity
FROM
@t1
CROSS JOIN
@t2
END
Un autre, à partir d'un exemple, qui dit que dans une procédure stockée, les tables de hachage ne peut pas être utilisé. Donc, ici, c'est:
2e:
CREATE PROCEDURE TempTable AS ---- It's actually not possible in SP
CREATE table #Color
(
Color varchar(10) PRIMARY key
)
INSERT INTO #color
SELECT 'Red'
UNION
SELECT 'White'
UNION
SELECT 'green'
UNION
SELECT 'Yellow'
UNION
SELECT 'blue'
DROP TABLE #color
CREATE table #Color
(
Color varchar(10) PRIMARY key
)
INSERT INTO #color
SELECT 'Red'
UNION
SELECT 'White'
UNION
SELECT 'green'
UNION
SELECT 'Yellow'
UNION
SELECT 'blue'
DROP TABLE #color
GO
Donc ma question est ce que je peux dire que le 1er est un exemple de table de hachage qu'il utilise des tables temporaires et si non, pourquoi ne pouvons-nous pas l'utiliser dans la procédure stockée? Encore une fois, si c'est à l'interne, ce pourquoi nous avons besoin de créer une table de hachage de nouveau pour travailler les fins (même s'il a des problèmes de performances, demandais juste pour savoir si les exemples ci-dessus servent à cet effet). Merci.
Remarque: j'ai fait face à une interview le mois dernier et a été de discuter de ce sujet. C'est la raison pour laquelle assurez-vous si j'ai été correct dans mes vues.
- Je pense que vous pourriez avoir une certaine confusion entre les tables de hachage et des tables préfixées avec le
#
(hash) symbole? Ces derniers sont rien à voir avec l'informatique table de hachage. C'est juste une appellation exigence pour les tables temporaires locales.
Vous devez vous connecter pour publier un commentaire.
C'est trop long pour un commentaire.
De hachage basée sur les algorithmes sont importants pour qu'une base de données puissante. Ceux-ci sont utilisés pour l'agrégation et des opérations de jointure. De hachage basée sur les jointures ont été là depuis la version 7.0, qui est vraiment vieux (merci à Martin Smith). Vous pouvez lire plus sur eux dans les la documentation.
SQL Server 2014 introduit de hachage basée sur les indices de la mémoire optimisée des tables (voir ici). Ce sont explicitement l'utilisation de tables de hachage. En général, cependant, les arbres, les indices sont plus puissants, car ils peuvent être utilisés dans des situations plus:
like
).order by
.Un index de hachage ne peut être utilisé pour une exacte égalité match (et
group by
).Je sais je suis un peu en retard à la fête, mais je ne pense pas que quelqu'un a directement répondu à votre question initiale.
Le premier est un exemple d'une variable de table et le second est un exemple d'un tableau local, les deux sont créés dans la base de données tempdb
La différence entre eux, c'est qu'une variable de table n'est pas créée dans la mémoire et ne peut pas avoir un index cluster.
Aussi local (hash) de la table va rester jusqu'à ce que seule fin de la connexion, alors qu'une variable de table est disponible uniquement pour le lot son déclarée.
Un tableau global (à l'aide d'un double hachage avant elle) sera disponible pour toutes les connexions et persistent jusqu'à ce que toutes les connexions de l'utiliser sont fermés.
Une dernière chose, la seule raison pour laquelle vous ne pouvez pas utiliser cette table locale dans une procédure stockée est parce qu'il utilise le même nom deux fois, même si vous avez utilisé drop table il évalue sur la base de la crée dans le lot en premier. Alors il l'habitude d'exécuter quoi que ce soit et gémir elle existe déjà.
Veuillez considérer également les notes suivantes comme un long commentaire et non comme réponse distincte:
[ 1 ] SQL Server ont join (
INNER HASH JOIN
) et les indicateurs de requête (OPTION (HASH JOIN)
,OPTION(HAS GROUP')
) afin d'appliquer un tel physique des jointures ou de regroupement.[ 2 ] en Interne, SQL Server utilise une table de hachage, de verrouiller les identificateurs. Voir les sans-papiers, la fonction %%lockres%% (réf. http://www.sqlskills.com/blogs/paul/investigating-locking-and-deadlocking-with-lockres/).
[ 3 ] en tant Que développeur de base de données, j'ai utilisé des "tables de hachage" (une colonne calculée définie en utilisant une fonction de hachage) pour l'indice de la taille du texte (ou gouttes) donc:
Remarque: veuillez jouer avec attention quand l'indexation des colonnes calculées (voir les conditions pour
SET
tings).