在过去的几天里,我一直在阅读一本关于数据结构的电子书,坦率地说,很多事情已经从我的脑海中消失了。只是审查它们并试图再次澄清。我正在浏览哈希表并再次熟悉它。所以我知道并听说,SQL Server 在内部使用哈希表,stackoverflow.com 和 forums.asp.net 的许多线程询问有关在 SQL Server 中创建哈希表,因为它存储临时数据。所以让我举一个我在使用临时表的存储过程中使用的例子:(避免它,它太长了。只是一个例子)
第一个:
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
另一个例子,在存储过程中,不能使用哈希表。所以这里是:
第二:
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
所以我的问题是我可以说第一个是哈希表的一个例子,因为它使用临时表,如果不是,为什么我们不能在存储过程中使用它?同样,如果它是内部创建的,为什么我们需要再次创建一个哈希表以用于工作目的(虽然它有性能问题,只是想知道上面的示例是否用于此目的)。谢谢。
注意: 我上个月接受了一次采访,正在讨论这个问题。这就是为什么要确定我的观点是否正确。
原文由 AT-2017 发布,翻译遵循 CC BY-SA 4.0 许可协议
基于散列的算法对于任何强大的数据库都很重要。这些用于聚合和连接操作。从 7.0 版开始就存在基于哈希的联接——这真的很老了(感谢 Martin Smith)。您可以在 文档中阅读更多关于它们的信息。
SQL Server 2014 为内存优化表引入了基于哈希的索引(参见 此处)。这些是对哈希表的显式使用。但总的来说,基于树的索引更强大,因为它们可以在更多情况下使用:
like
)。order by
。哈希索引只能用于完全相等匹配(和
group by
)。