【问题标题】:SQL: speed up searching multiple criteriaSQL:加快搜索多个条件
【发布时间】:2017-03-04 09:46:41
【问题描述】:

我是 SQL 的菜鸟,所以对某人来说可能是一个简单的问题。现在我有两张表,比如说 A 和 B。

A有“性别”、“年龄”、“学历”、“工作年限”、“居住状况”、“技能水平”、“职业”等栏目。

B有“性别”、“年龄”、“学历”、“工作年限”、“居住地”、“年收入”等栏目。 (前5个和A一样)

现在我想从 B 中搜索这 5 个条件,并在表 A 中添加一列“年收入”。我尝试使用 INNER JOIN,例如:

选择 A.*、B.annual_income

FROM B INNER JOIN A ON (A.gender = B.gender)

AND (A.age = B.age)

AND (A.academic_degree = B.academic_degree)

AND (A.years_of_working_experience = B.years_of_working_experience)

AND (A.state_of_residence = B.state_of_residence);

代码确实有效,但耗时太长。有谁知道是否有更快的算法来解决这个问题?谢谢!

【问题讨论】:

    标签: sql ms-access inner-join


    【解决方案1】:

    查询性能调优可能是一个棘手的话题...我可能会提供一些提示,但您需要考虑更多信息,而不仅仅是问题中提供的信息才能真正确定解决方案。

    我从您的问题标签中收集到您正在使用 MS Access,所以这是我在这里的工作假设...我还假设数据是本地的(即存储在 .MDB 文件中,而不是链接的远程表中)。

    您可以对查询性能产生的最大影响是确保您的查询与您的物理数据模型相配合。你所描述的表格结构可能会让你很难说实话。

    每个表中是否还有其他列,例如代理键?如果您可以使用更简单的连接,它可能有助于提高性能。无论您是否有更简单的连接键,确保连接键在两个表中都被正确索引可能是影响性能的最大一步。

    你问是否有另一种算法......在编写 SQL 时,你并没有真正考虑特定的算法——数据库会处理这个问题——但就问题的精神而言,我会说不。加入是您需要做的。

    如果您需要多次执行此操作,那么可能值得改进物理数据模型。 (如果您只需要连接一次数据,那么这可能不值得,因为将数据转换为改进的模型可能需要运行一次连接的时间。)

    因此假设 (age,gender,degree,years,state) 的每个组合在每个表中只出现一次,您可以创建一个新表,为每个组合分配一个唯一整数;然后将索引整数列添加到每个表以存储分配的值。加入它应该比你拥有的更好。

    【讨论】:

    • 您好,非常感谢您的回复!我想知道是否有办法通过一些数字来索引每个人:例如,如果我们有 8 个年龄、2 个性别、3 个学位、6 个不同的年数和 5 个州,我可以分配一个 6 岁的人吗?第 2 性别、第 1 学位、第 5 年经验和第 5 州到索引“62155”?
    • 您所描述的或多或少是“智能键”的一种形式,它往往是自然键和代理键之间最糟糕的一种;所以我不建议这样做。如果您想为每个属性组合分配整数,我只需按顺序执行(然后确保两个表之间保持一致)。
    • 我也想过顺序做,但问题是如何让两张表保持一致。你能告诉我一些例子来做这样的事情吗?
    • 如果您知道两个表中存在完全相同的一组(年龄、性别、学位、年数、州)值,则以可重复的方式和顺序对行进行排序。然后索引顺序值和连接将很容易。或者...
    • ...如果存在不一样的风险,或者如果由于某种原因上述不合适,请在一个表中分配值,然后在 5 个属性上将两者连接以复制值进入第二张桌子。 (这就是为什么修复可能需要与加入一样长的时间,并且只有在你多次加入时才值得。)
    【解决方案2】:

    您的查询对于您要解决的任务是正确的,但如果您遇到性能问题,您可能需要为您的表添加索引。这篇文章是开始学习的好地方:Create and use an index to improve performance(虽然它是为 Access 2007 编写的,但它也应该适用于更高版本)。

    附带说明:您将表连接到许多不同的列上,而这两个表在存储的内容上似乎有很多重叠,这可能表明设计存在问题。

    我会考虑annual_income 是否真的属于一个单独的表 - 它似乎依赖于与所有其他信息相同的键。两个表似乎都保存与一个人有关的数据——那个人是另一个表中的实体,如果是这样,也许这两个表应该通过外键关系引用那个?

    您的问题可能缺少一些重要的设置细节,这些细节需要给您一个“正确”的答案。

    【讨论】:

      【解决方案3】:

      永远不要两次存储数据。尝试合并信息并摆脱一个表。关于您的问题,您可以创建所有 5 列的新列计算哈希,并加入该列以使其更快。

      检查这个计算哈希: https://superuser.com/questions/550592/is-there-an-excel-function-to-create-a-hash-value

      【讨论】:

      • 是的...实际上我不知道这两张桌子是谁制作的。如果下次我被要求再做这样的事情,我会把它们放在一起
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2018-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多