SQL Server 中的哈希表数据结构

新手上路,请多包涵

在过去的几天里,我一直在阅读一本关于数据结构的电子书,坦率地说,很多事情已经从我的脑海中消失了。只是审查它们并试图再次澄清。我正在浏览哈希表并再次熟悉它。所以我知道并听说,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 许可协议

阅读 556
1 个回答

基于散列的算法对于任何强大的数据库都很重要。这些用于聚合和连接操作。从 7.0 版开始就存在基于哈希的联接——这真的很老了(感谢 Martin Smith)。您可以在 文档中阅读更多关于它们的信息

SQL Server 2014 为内存优化表引入了基于哈希的索引(参见 此处)。这些是对哈希表的显式使用。但总的来说,基于树的索引更强大,因为它们可以在更多情况下使用:

  • 用于范围查找(包括 like )。
  • 对于部分键匹配。
  • 对于 order by

哈希索引只能用于完全相等匹配(和 group by )。

原文由 Gordon Linoff 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进