“F4111”是一个包含详细订单的表,其中输出“SU”订单类型,输入“OU”订单类型。所有“SU”订单都与一个特定的“OU”订单相关,因此所有SU和OU订单的总和应为零。他们的关系由他们的身份证明。如果SU orderID是1000,那么它的OU相关orderID是1001.我有一个SQL查询,它给了我一些特定的SU订单
TelephoneBookList * commandLoad(char* fileName) {
TelephoneBookList *(*createList)(TelephoneBookNode*, char[]) = createTelephoneBookList;
char entry[100];
TelephoneBookList* aList = NULL;
TelephoneBookNode* aNode = NULL;
FILE* telephoneListFile = NULL;
telephoneListFile = fopen(fileName, "r");
if (!telephoneListFile)
return NULL;
else {
while (!feof(telephoneListFile)) {
fgets(entry, 100, telephoneListFile);
if (strstr(entry, "#")) //skip the first 2 lines in text file
continue;
aList = (*createList)(aNode, entry); //call the below function
countEntry++;
}
aList->size = countEntry;
fclose(telephoneListFile);
return aList;
}
}
现在我需要另一个查询,它给我所有与特定SU订单相关的OU订单,所以我这样做了:
SELECT F4111.orderID FROM F4111 F4111
WHERE F4111.orderDATE='2016/05/09' AND F4111.orderTYPE='SU' AND F4111.orderDESTINY='333333'
但这很慢。 N个单独的查询更快,其中N是第一个查询中给出的唯一SU ID的数量。
知道怎么做得更快吗?提前谢谢。
答案 0 :(得分:0)
如果不知道这是什么类型的数据库,桌子上有什么索引以及行数,就很难猜到。但是,让我抛出一些建议。
确保子查询SELECT F4111.orderID+1 ...
速度很快。如果没有,则查看数据库的查询执行计划以查看花费的时间。您可能需要索引orderDATE
列。如果orderTYPE
单独编入索引,您可能希望删除该列或将另一列添加到索引以提高其基数。
如果子查询不是问题那么事情有点模糊,因为最简单的解释也是最不可能的:orderID
上没有索引或者数据库查询引擎正在选择不要使用该索引。值得一试。再次,学习如何查看数据库的查询执行计划将帮助您查明问题。
将查询重写为使用内部联接而不是IN (SELECT ...)
会很简单,但没有特别的理由期望这样做有所帮助。不过,你可以尝试一下。如果它有效,那么值得花时间比较它和原始SQL的执行计划。
(您可能已经感受到这些建议的反复出现的主题。)