AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 237684
Accepted
Joe Obbish
Joe Obbish
Asked: 2019-05-09 13:01:06 +0800 CST2019-05-09 13:01:06 +0800 CST 2019-05-09 13:01:06 +0800 CST

将许多可为空的整数 1:1 转换为二进制字符串的最快方法是什么?

  • 772

我的部分工作负载使用了一个CLR 函数,该函数实现了诡异的哈希算法来比较行以查看是否有任何列值发生了变化。CLR 函数将二进制字符串作为输入,因此我需要一种将行转换为二进制字符串的快速方法。我希望在整个工作负载期间散列大约 100 亿行,所以我希望这段代码尽可能快。

我有大约 300 个不同模式的表。出于这个问题的目的,请假设一个包含 32 个可空INT列的简单表结构。我在这个问题的底部提供了示例数据以及对结果进行基准测试的方法。

如果所有列值都相同,则必须将行转换为相同的二进制字符串。如果任何列值不同,则必须将行转换为不同的二进制字符串。例如,像下面这样简单的代码将不起作用:

CAST(COL1 AS BINARY(4)) + CAST(COL2 AS BINARY(4)) + ..

它不能正确处理零。如果COL1第 1COL2行为 NULL,第 2 行为 NULL,则这两行都将转换为 NULL 字符串。我相信正确处理 NULL 是正确转换整行最难的部分。INT 列的所有允许值都是可能的。

提出一些问题:

  • 如果重要的话,大部分时间(90% 以上)列不会为 NULL。
  • 我必须使用CLR。
  • 我必须放置这么多行。我不能坚持哈希。
  • 我相信由于 CLR 功能的存在,我不能使用批处理模式进行转换。

将 32 个可空INT列转换为BINARY(X)字符串VARBINARY(X)的最快方法是什么?

承诺的示例数据和代码:

-- create sample data
DROP TABLE IF EXISTS dbo.TABLE_OF_32_INTS;

CREATE TABLE dbo.TABLE_OF_32_INTS (
    COL1 INT NULL,
    COL2 INT NULL,
    COL3 INT NULL,
    COL4 INT NULL,
    COL5 INT NULL,
    COL6 INT NULL,
    COL7 INT NULL,
    COL8 INT NULL,
    COL9 INT NULL,
    COL10 INT NULL,
    COL11 INT NULL,
    COL12 INT NULL,
    COL13 INT NULL,
    COL14 INT NULL,
    COL15 INT NULL,
    COL16 INT NULL,
    COL17 INT NULL,
    COL18 INT NULL,
    COL19 INT NULL,
    COL20 INT NULL,
    COL21 INT NULL,
    COL22 INT NULL,
    COL23 INT NULL,
    COL24 INT NULL,
    COL25 INT NULL,
    COL26 INT NULL,
    COL27 INT NULL,
    COL28 INT NULL,
    COL29 INT NULL,
    COL30 INT NULL,
    COL31 INT NULL,
    COL32 INT NULL
);

INSERT INTO dbo.TABLE_OF_32_INTS WITH (TABLOCK)
SELECT 0, 123, 12345, 1234567, 123456789
, 0, 123, 12345, 1234567, 123456789
, 0, 123, 12345, 1234567, 123456789
, 0, 123, 12345, 1234567, 123456789
, 0, 123, 12345, 1234567, 123456789
, 0, 123, 12345, 1234567, 123456789
, NULL, -876545321
FROM
(
    SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) RN
    FROM master..spt_values t1
    CROSS JOIN master..spt_values t2
) q
OPTION (MAXDOP 1);


GO


-- procedure to test performance
CREATE OR ALTER PROCEDURE #p AS 
BEGIN

SET NOCOUNT ON;

DECLARE
@counter INT = 0,
@dummy VARBINARY(8000);

WHILE @counter < 10
BEGIN
    SELECT @dummy = -- this code is clearly incomplete as it does not handle NULLs
        CAST(COL1 AS BINARY(4)) + 
        CAST(COL2 AS BINARY(4)) + 
        CAST(COL3 AS BINARY(4)) + 
        CAST(COL4 AS BINARY(4)) + 
        CAST(COL5 AS BINARY(4)) + 
        CAST(COL6 AS BINARY(4)) + 
        CAST(COL7 AS BINARY(4)) + 
        CAST(COL8 AS BINARY(4)) + 
        CAST(COL9 AS BINARY(4)) + 
        CAST(COL10 AS BINARY(4)) + 
        CAST(COL11 AS BINARY(4)) + 
        CAST(COL12 AS BINARY(4)) + 
        CAST(COL13 AS BINARY(4)) + 
        CAST(COL14 AS BINARY(4)) + 
        CAST(COL15 AS BINARY(4)) + 
        CAST(COL16 AS BINARY(4)) + 
        CAST(COL17 AS BINARY(4)) + 
        CAST(COL18 AS BINARY(4)) + 
        CAST(COL19 AS BINARY(4)) + 
        CAST(COL20 AS BINARY(4)) + 
        CAST(COL21 AS BINARY(4)) + 
        CAST(COL22 AS BINARY(4)) + 
        CAST(COL23 AS BINARY(4)) + 
        CAST(COL24 AS BINARY(4)) + 
        CAST(COL25 AS BINARY(4)) + 
        CAST(COL26 AS BINARY(4)) + 
        CAST(COL27 AS BINARY(4)) + 
        CAST(COL28 AS BINARY(4)) + 
        CAST(COL29 AS BINARY(4)) + 
        CAST(COL30 AS BINARY(4)) + 
        CAST(COL31 AS BINARY(4)) + 
        CAST(COL32 AS BINARY(4))
    FROM dbo.TABLE_OF_32_INTS
    OPTION (MAXDOP 1);

    SET @counter = @counter + 1;
END;

SELECT cpu_time
FROM sys.dm_exec_requests
WHERE session_id = @@SPID;

END;

GO

-- run procedure
EXEC #p;

(我仍然会在这个二进制结果上使用诡异的哈希。工作负载使用哈希连接,哈希值用于其中一个哈希构建。我不希望哈希构建中有一个长二进制值,因为它需要太多记忆。)

sql-server sql-server-2017
  • 5 5 个回答
  • 379 Views

5 个回答

  • Voted
  1. Paul White
    2019-05-12T10:16:11+08:002019-05-12T10:16:11+08:00

    在我的机器 (SQL Server 2017) 上,以下 C# SQLCLR 函数的运行速度比这个想法快 30%,比binary(5)35% 快CONCAT_WS,并且在自我回答的一半时间内运行。

    It requires UNSAFE permission and uses pointers. The implementation is very specifically tied to the test data.

    For testing purposes, the easiest way to get this unsafe assembly working is to set the database to TRUSTWORTHY and disable the clr strict security configuration option if necessary.

    Compiled code

    For convenience the CREATE ASSEMBLY compiled bits are at https://gist.github.com/SQLKiwi/72d01b661c74485900e7ebcfdc63ab8e

    T-SQL Function Stub

    CREATE FUNCTION dbo.NullableIntsToBinary
    (
        @Col01 int, @Col02 int, @Col03 int, @Col04 int, @Col05 int, @Col06 int, @Col07 int, @Col08 int, 
        @Col09 int, @Col10 int, @Col11 int, @Col12 int, @Col13 int, @Col14 int, @Col15 int, @Col16 int, 
        @Col17 int, @Col18 int, @Col19 int, @Col20 int, @Col21 int, @Col22 int, @Col23 int, @Col24 int, 
        @Col25 int, @Col26 int, @Col27 int, @Col28 int, @Col29 int, @Col30 int, @Col31 int, @Col32 int
    )
    RETURNS binary(132) 
    WITH EXECUTE AS CALLER
    AS EXTERNAL NAME Obbish.UserDefinedFunctions.NullableIntsToBinary;
    

    Source code

    The C# source is at https://gist.github.com/SQLKiwi/64f320fe7fd802a68a3a644aa8b8af9f

    If you compile this for yourself, you must use a Class Library (.dll) as the target project type and check the Allow Unsafe Code build option.

    Combined solution

    Since you ultimately want to compute the SpookyHash of the binary data returned above, you can call SpookyHash within the CLR function and return the 16-byte hash.

    An example implementation based on a table with a mixture of column data types is at https://gist.github.com/SQLKiwi/6f82582a4ad1920c372fac118ec82460. This includes an unsafe inlined version of the Spooky Hash algorithm derived from Jon Hanna's SpookilySharp and the original public domain C source code by Bob Jenkins.

    • 11
  2. Joe Obbish
    2019-05-09T16:26:48+08:002019-05-09T16:26:48+08:00

    一INT列有四个字节的允许值,它们与 a 的大小完全匹配BINARY(4)。换句话说,BINARY(4) 的每个可能值都与INT列的可能值相匹配。因此,除非列中存在不允许的值,否则INTNULL 没有安全的替代品。列是否为 NULL 必须单独编码。它根本无法放入BINARY(4).

    一种方法是使用 NULL 位图。考虑以下代码:

    CAST(       
        CASE WHEN COL1 IS NOT NULL THEN 0 ELSE 1 END | 
        CASE WHEN COL2 IS NOT NULL THEN 0 ELSE 2 END | 
        CASE WHEN COL3 IS NOT NULL THEN 0 ELSE 4 END | 
        CASE WHEN COL4 IS NOT NULL THEN 0 ELSE 8 END | 
        CASE WHEN COL5 IS NOT NULL THEN 0 ELSE 16 END | 
        CASE WHEN COL6 IS NOT NULL THEN 0 ELSE 32 END | 
        CASE WHEN COL7 IS NOT NULL THEN 0 ELSE 64 END | 
        CASE WHEN COL8 IS NOT NULL THEN 0 ELSE 128 END
    AS BINARY(1))
    

    八列是否为 NULL 适合单个字节。这些表达式可以在行之间进行比较,以检查所有相同的列是否为 NULL 或非 NULL。有了这些附加信息,就可以安全地将 NULL 列值替换为任何非 NULL 值。我发现CAST(ISNULL(COL1, 0) AS BINARY(4))它是最快的,尽管其他变化ISNULL(CAST(COL1 AS VARBINARY(4)), 0x)是可能的。

    很难肯定地证明任何事情,但我发现以下细节是最快的:

    • 在位图中使用 0 表示 NOT NULL,因为我知道大多数列值不会为 NULL
    • 对位图使用按位或代替加法
    • 检查列值是否为 NULL,而不是转换后的二进制值

    在我的机器上,基准测试需要大约 27.5 CPU 秒。不幸的是,NULL 位图步骤大约需要三分之一的时间。如果有更快的方法来做到这一点,那就太好了。

    这是完整的解决方案:

    SELECT
        CAST(ISNULL(COL1, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL2, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL3, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL4, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL5, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL6, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL7, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL8, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL9, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL10, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL11, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL12, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL13, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL14, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL15, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL16, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL17, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL18, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL19, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL20, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL21, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL22, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL23, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL24, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL25, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL26, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL27, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL28, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL29, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL30, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL31, 0) AS BINARY(4)) + 
        CAST(ISNULL(COL32, 0) AS BINARY(4)) + 
        CAST(       
            CASE WHEN COL1 IS NOT NULL THEN 0 ELSE 1 END | 
            CASE WHEN COL2 IS NOT NULL THEN 0 ELSE 2 END | 
            CASE WHEN COL3 IS NOT NULL THEN 0 ELSE 4 END | 
            CASE WHEN COL4 IS NOT NULL THEN 0 ELSE 8 END | 
            CASE WHEN COL5 IS NOT NULL THEN 0 ELSE 16 END | 
            CASE WHEN COL6 IS NOT NULL THEN 0 ELSE 32 END | 
            CASE WHEN COL7 IS NOT NULL THEN 0 ELSE 64 END | 
            CASE WHEN COL8 IS NOT NULL THEN 0 ELSE 128 END
        AS BINARY(1)) + 
        CAST(   
            CASE WHEN COL9  IS NOT NULL THEN 0 ELSE 1 END | 
            CASE WHEN COL10 IS NOT NULL THEN 0 ELSE 2 END | 
            CASE WHEN COL11 IS NOT NULL THEN 0 ELSE 4 END | 
            CASE WHEN COL12 IS NOT NULL THEN 0 ELSE 8 END | 
            CASE WHEN COL13 IS NOT NULL THEN 0 ELSE 16 END | 
            CASE WHEN COL14 IS NOT NULL THEN 0 ELSE 32 END | 
            CASE WHEN COL15 IS NOT NULL THEN 0 ELSE 64 END | 
            CASE WHEN COL16 IS NOT NULL THEN 0 ELSE 128 END
        AS BINARY(1)) + 
        CAST(   
            CASE WHEN COL17 IS NOT NULL THEN 0 ELSE 1 END | 
            CASE WHEN COL18 IS NOT NULL THEN 0 ELSE 2 END | 
            CASE WHEN COL19 IS NOT NULL THEN 0 ELSE 4 END | 
            CASE WHEN COL20 IS NOT NULL THEN 0 ELSE 8 END | 
            CASE WHEN COL21 IS NOT NULL THEN 0 ELSE 16 END | 
            CASE WHEN COL22 IS NOT NULL THEN 0 ELSE 32 END | 
            CASE WHEN COL23 IS NOT NULL THEN 0 ELSE 64 END | 
            CASE WHEN COL24 IS NOT NULL THEN 0 ELSE 128 END
        AS BINARY(1)) + 
        CAST(   
            CASE WHEN COL25 IS NOT NULL THEN 0 ELSE 1 END | 
            CASE WHEN COL26 IS NOT NULL THEN 0 ELSE 2 END | 
            CASE WHEN COL27 IS NOT NULL THEN 0 ELSE 4 END | 
            CASE WHEN COL28 IS NOT NULL THEN 0 ELSE 8 END | 
            CASE WHEN COL29 IS NOT NULL THEN 0 ELSE 16 END | 
            CASE WHEN COL30 IS NOT NULL THEN 0 ELSE 32 END | 
            CASE WHEN COL31 IS NOT NULL THEN 0 ELSE 64 END | 
            CASE WHEN COL32 IS NOT NULL THEN 0 ELSE 128 END
        AS BINARY(1))
    FROM dbo.TABLE_OF_32_INTS
    OPTION (MAXDOP 1);
    
    • 7
  3. Best Answer
    Steven Hibble
    2019-05-10T08:12:48+08:002019-05-10T08:12:48+08:00

    使用BINARY(5)NULL 并将其转换为 INT 范围之外的内容怎么样:

    SELECT @dummy =
        ISNULL(CAST(COL1  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL2  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL3  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL4  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL5  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL6  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL7  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL8  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL9  AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL10 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL11 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL12 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL13 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL14 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL15 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL16 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL17 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL18 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL19 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL20 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL21 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL22 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL23 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL24 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL25 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL26 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL27 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL28 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL29 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL30 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL31 AS BINARY(5)), 0x0100000000) + 
        ISNULL(CAST(COL32 AS BINARY(5)), 0x0100000000)
    FROM dbo.TABLE_OF_32_INTS
    OPTION (MAXDOP 1);
    
    • 6
  4. Mikael Eriksson
    2019-05-10T01:24:21+08:002019-05-10T01:24:21+08:00

    在我的测试中, concat_ws比您的空位图解决方案(26 秒)快一点(18 秒)。将有更多数据需要随机播放,因此您可能会在其他地方看到一些性能下降,如果您想将其与字符列混合,您必须明智地选择分隔符。

    select @dummy = cast(concat_ws('|',
             isnull(cast(T.COL1  as varchar(11)), ''),
             isnull(cast(T.COL2  as varchar(11)), ''),
             isnull(cast(T.COL3  as varchar(11)), ''),
             isnull(cast(T.COL4  as varchar(11)), ''),
             isnull(cast(T.COL5  as varchar(11)), ''),
             isnull(cast(T.COL6  as varchar(11)), ''),
             isnull(cast(T.COL7  as varchar(11)), ''),
             isnull(cast(T.COL8  as varchar(11)), ''),
             isnull(cast(T.COL9  as varchar(11)), ''),
             isnull(cast(T.COL10 as varchar(11)), ''),
             isnull(cast(T.COL11 as varchar(11)), ''),
             isnull(cast(T.COL12 as varchar(11)), ''),
             isnull(cast(T.COL13 as varchar(11)), ''),
             isnull(cast(T.COL14 as varchar(11)), ''),
             isnull(cast(T.COL15 as varchar(11)), ''),
             isnull(cast(T.COL16 as varchar(11)), ''),
             isnull(cast(T.COL17 as varchar(11)), ''),
             isnull(cast(T.COL18 as varchar(11)), ''),
             isnull(cast(T.COL19 as varchar(11)), ''),
             isnull(cast(T.COL20 as varchar(11)), ''),
             isnull(cast(T.COL21 as varchar(11)), ''),
             isnull(cast(T.COL22 as varchar(11)), ''),
             isnull(cast(T.COL23 as varchar(11)), ''),
             isnull(cast(T.COL24 as varchar(11)), ''),
             isnull(cast(T.COL25 as varchar(11)), ''),
             isnull(cast(T.COL26 as varchar(11)), ''),
             isnull(cast(T.COL27 as varchar(11)), ''),
             isnull(cast(T.COL28 as varchar(11)), ''),
             isnull(cast(T.COL29 as varchar(11)), ''),
             isnull(cast(T.COL30 as varchar(11)), ''),
             isnull(cast(T.COL31 as varchar(11)), ''),
             isnull(cast(T.COL32 as varchar(11)), ''))
           as varbinary(8000))
    from dbo.TABLE_OF_32_INTS as T
    option (maxdop 1)
    
    • 5
  5. David Browne - Microsoft
    2019-05-09T14:07:06+08:002019-05-09T14:07:06+08:00

    如果您可以提前确保不存储某些特定的 int,-2,147,483,648那么您可以执行以下操作:

     SELECT @dummy = 
            coalesce(CAST(COL1 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL2 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL3 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL4 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL5 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL6 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL7 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL8 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL9 AS BINARY(4)),  0x80000000) + 
            coalesce(CAST(COL10 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL11 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL12 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL13 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL14 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL15 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL16 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL17 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL18 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL19 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL20 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL21 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL22 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL23 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL24 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL25 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL26 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL27 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL28 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL29 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL30 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL31 AS BINARY(4)), 0x80000000) + 
            coalesce(CAST(COL32 AS BINARY(4)), 0x80000000) 
        FROM dbo.TABLE_OF_32_INTS
    
    • -1

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve