加入SQL查询以提高性能

时间:2014-09-20 03:45:25

标签: sql loops join while-loop

我遇到了性能问题而且我只是想了解SQL查询的连接是什么,我已经阅读了一些示例并认为自己是一个狂热的编码器但是这个总是令我感到困惑,我刚才做了以下几点实现我的目标......

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

然后这些结果在一个数组中,我用逗号来破坏在下一个查询中使用! - 我知道非常糟糕,或者是......

我想结束,最后所有来自STOCK表的WHERE AUXKEY被设置为' Y'在STAUX000中

有意义吗?

$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]);
} 

3 个答案:

答案 0 :(得分:0)

为什么不尝试加入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
)

答案 1 :(得分:0)

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

我相信你的循环等同于此(不包括"喜欢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')

对于一组SMALL值,IN()很棒,对于一个非常大的列表,它不是正常的,它确实会非常慢。它不如使用连接有效,也不能扩展到大容量。你必须记住,关系数据库是针对"关系"在数据中,以及联接的作用 - 在数据中建立关系。当你使用IN()这样的其他设施时,你没有达到RDBMS的最佳位置,而是略微偏向一边,而且它只是一样好。

同样要警惕诸如AND UPPER(STOCK.NAME) LIKE UPPER('%')之类的内容,这会导致多个性能问题。我建议你阅读这篇关于" sargable"的参考文献。当您在字段上运行UPPER等函数时,您可以删除引用索引的功能,这将意味着您的查询变慢。 LIKE也是性能问题。

答案 2 :(得分:0)

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

出于某种原因,回来的速度更快了?