【问题标题】:How to have a proper between query that uses hashed/indexed structure如何在使用散列/索引结构的查询之间进行适当的处​​理
【发布时间】:2015-02-27 21:22:08
【问题描述】:

我找不到这个问题的解决方案,因为它看起来非常复杂

这里有 1 个 3 列的表

CodeVal_1   bigint  Unchecked 
CodeVal_2   bigint  Unchecked
CountryCode char(2) Unchecked

CodeVal_1 和 CodeVal_2 共同构成主键

所以这个表包含如下数据

CodeVal_1   CodeVal_2   CountryCode
7602176     7864319     AT
16777216    16777471    AU
16777472    16778239    CN
16778240    16779263    AU
16779264    16781311    CN
16781312    16785407    JP
16785408    16793599    CN

现在我需要查询这个表

select CountryCode from tblCountryCodes where 215454 between CodeVal_1 and CodeVal_2

这在 SQL 服务器上完美运行,但是每次查询调用都很慢。所以我想通过一些预加载等在整个 C# 代码中完成这项工作。

但是我找不到比 SQL Server 2014 更快的正确方法

是否有可能通过某种双索引(我不知道这只是抛出想法)、哈希表、字典等来实现它

等待您的想法和建议

【问题讨论】:

  • 看起来CodeVal_2 总是大于CodeVal_1?如果CodeVal_2 已排序,您可以进行缩略搜索。当CodeVal_2 大于或等于您要检查的数字时,您可以只检查记录而侥幸逃脱。或者甚至将记录拆分为多个列表(可能 number_of_lists = number_of_records 除以 100 或 1000 之类的),找到搜索编号将落入的列表,然后仅在该列表上执行上述缩写搜索。
  • itsme86 你能详细说明如何在 csharp 上快速检查大于或等吗?是否有这样的索引结构等而不是每次扫描整个内存?
  • 你的表有多少行?它们都适合记忆吗?

标签: c# .net sql-server


【解决方案1】:

“进行每个查询调用”是指您要进行多次调用,以不同的值替换 215454?

如果是这种情况,您可以通过逗号分隔的字符串(由函数拆分)、xml 或表值参数为存储过程提供多个值,以允许您在一次调用中检索多个值。例如:

CREATE PROCEDURE [dbo].[usp_Table_SetVisibility] (
    @TableIds VARCHAR(MAX),
    @IsVisible BIT
)
AS

    UPDATE  e
    SET     e.IsVisible = @IsVisible
    FROM    dbo.udf_SplitString(@TableIds, ',') s
        INNER JOIN dbo.[Table] e ON e.TableId = s.Value;

GO

【讨论】:

  • 回答但每次单个查询具有不同的值。我真的在寻找非 SQL 服务器解决方案,因为它是最大优化的 atm
猜你喜欢
  • 2014-01-14
  • 1970-01-01
  • 1970-01-01
  • 2017-07-16
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 2019-04-10
相关资源
最近更新 更多