SQL Server中的哈希表数据结构

AT-*_*017 1 sql sql-server stored-procedures hashtable sql-server-2008

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

另一个例子,在存储过程中说,哈希表不能使用.所以这是:

第二:

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
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,我可以说第一个是哈希表的一个例子,因为它使用临时表,如果没有,为什么我们不能在存储过程中使用它?同样,如果它是在内部创建的,为什么我们需要再次为工作目的创建一个哈希表(虽然它有性能问题,只是想知道上面的例子是否用于此目的).谢谢.

注意:我上个月接受了一次采访,正在讨论它.这就是为什么要确保我的观点是否正确.

Gor*_*off 5

这个评论太长了.

基于散列的算法对于任何强大的数据库都很重要.这些用于聚合和连接操作.自7.0版本以来,基于哈希的联接一直存在 - 这真的很旧(感谢Martin Smith).您可以在文档中阅读有关它们的更多信息.

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

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

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