【问题标题】:JOIN SQL Query for Improved Performance加入 SQL 查询以提高性能
【发布时间】:2014-11-14 16:49:25
【问题描述】:

我遇到了性能问题,我只是想确切地了解 SQL 查询的连接所达到的效果,我已经阅读了一些示例,并认为自己是一个狂热的编码器,但是这个总是让我感到困惑,以至于我只是做了以下事情实现我的目标....

你会从下面看到,首先我从 STAUX000 WHERE WEBSHOW = 'Y' 获取所有 AUXKEY

然后将这些结果放在一个数组中,我用逗号将其内爆,以便在下一个查询中使用! - 很糟糕,我知道,或者是......

我想结束,最后全部来自 STOCK 表 WHERE AUXKEY 在 STAUX000 中设置为“Y”

有意义吗?

$webshow = "SELECT AUXKEY FROM STAUX000 WHERE WEBSHOW = 'Y' ";
$wsres = odbc_exec($connectforwebshow, $webshow); 

while( $wsrow = odbc_fetch_array($wsres) ) { 
$_SESSION[showontheweb][] = $wsrow[AUXKEY];

}

$showondaweb = $_SESSION[showontheweb];
$imploded_arr = implode("', '000", $showondaweb);


$cfwsq = db_connect();

$wstquery = "SELECT NAME, NUMBER FROM STOCK ";
$wstquery .= "WHERE STOCK.LOCATION = 'LANE' AND UPPER(STOCK.NAME) LIKE UPPER('%') AND         NUMBER IN ('000"; 
$wstquery .= "$imploded_arr";
$wstquery .= "') ";

$wbstres = odbc_exec($cfwsq, $wstquery); 

while( $wbstrow = odbc_fetch_array($wbstres) ) {
$NUMBER = $wbstrow[NUMBER];
$_SESSION[allstock][NAME][] = ($wbstrow[NAME]);
$_SESSION[allstock][NUMBER][] = ($wbstrow[NUMBER]);
} 

【问题讨论】:

    标签: sql loops join while-loop


    【解决方案1】:

    不如试试加入sql代码,让sql优化一下。

    类似:

    SELECT NAME, NUMBER
    FROM STOCK
    WHERE STOCK.LOCATION = 'LANE' 
    AND UPPER(STOCK.NAME) LIKE UPPER('%') 
    AND exists  
    (
        SELECT AUXKEY
        FROM STAUX000
        WHERE WEBSHOW = 'Y'  
        AND STOCK.NUMBER = STAUX000.AUXKEY
    )
    

    【讨论】:

      【解决方案2】:

      您永远无法通过发出低效查询的循环结构来匹配 SQL 连接的效率 - 抱歉。您也许可以快速连接查询字符串,但这并不能提高查询执行的效率。

      我相信你的循环等同于这个(暂时不包括“like bit”):

      SELECT
            S.NAME
          , S.NUMBER 
      FROM STOCK S
      INNER JOIN STAUX000 X ON S.NUMBER = X.AUXKEY
      WHERE S.LOCATION = 'LANE' 
      AND X.WEBSHOW = 'Y'
      

      我真的希望 IN() 从来没有被发明过,它被滥用和误解了。 IN() 实际上只是 OR 的缩写形式,如下所示:where number IN ('123','456','789',.....,'999...999')

      执行为:where (number='123' OR number='456' or number='789' ..... or number='999...999')

      对于一个小的值集 IN () 很好,对于一个非常大的列表它在 NOT OK 并且它确实会变得非常慢。它不如使用连接高效,也不能扩展到大容量。您必须记住,关系数据库针对数据中的“关系”进行了调整,这就是连接的作用——在数据中建立关系。当您使用 IN () 等其他工具时,您并没有达到 RDBMS 的最佳位置,而是稍微偏向一边,而且效果并不好。

      还要非常小心 AND UPPER(STOCK.NAME) LIKE UPPER('%') 这样的东西,这有多个性能问题。我建议您阅读有关“sargable”的参考资料。当您在字段上运行诸如 UPPER 之类的函数时,您可能会删除引用索引的能力,这意味着您的查询会变慢。 LIKE 对性能也有问题。

      【讨论】:

      • 您好,我试过这个查询,有趣的是我真的试过这个,但没有运气 - SELECT S.NAME , S.NUMBER FROM STOCK S INNER JOIN STAUX000 X ON S.NUMBER = X.AUXKEY WHERE S.位置 = '车道' 和 X.WEBSHOW = 'Y'
      • “不走运”究竟是什么意思?
      • (使用 sql 工具)我建议您尝试不使用 where clause 这将确定连接是否有效。然后逐步添加 where 条件。
      • 是的,我认为它为什么不起作用是因为两列都不包含确切的数据,一个实际上有一个前缀 000 即,另一个更短,我需要添加零是否可以不使用 LIKE ?怎么办 S.NUMBER = X.AUXKEY
      【解决方案3】:
      SELECT STOCK.NUMBER, STOCK.NAME FROM STOCK JOIN STAUX000 ON STOCK.NUMBER =      '000'+STAUX000.AUXKEY 
      

      刚刚使用过这个并且工作了......

      编辑:其实这样更好 ---

      SELECT  STOCK.NUMBER, STOCK.NAME FROM STOCK JOIN STAUX000 ON RIGHT(STOCK.NUMBER, 7) = STAUX000.AUXKEY
      

      由于某种原因,回来得更快?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-05-26
        • 2016-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多