Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更有效地获取SQL结果_Sql_Select_Count_Db2_Where - Fatal编程技术网

如何更有效地获取SQL结果

如何更有效地获取SQL结果,sql,select,count,db2,where,Sql,Select,Count,Db2,Where,我在DB2数据库中的SQL查询有问题。我必须根据通过一些字段连接的第二个表中的记录数从一个表中获取记录。我的查询速度非常慢。我一直在试图找到一种更有效的方法,甚至使用内部连接,但仍然是一样的 SELECT * FROM table1 WHERE table1.field1 = '9' AND table1.field2 <= CURRENT DATE - 1 YEAR AND ( SELECT COUNT(*) FROM table2 WHERE

我在DB2数据库中的SQL查询有问题。我必须根据通过一些字段连接的第二个表中的记录数从一个表中获取记录。我的查询速度非常慢。我一直在试图找到一种更有效的方法,甚至使用内部连接,但仍然是一样的

SELECT * FROM table1

WHERE

    table1.field1 = '9' AND
    table1.field2 <= CURRENT DATE - 1 YEAR AND
    (
    SELECT COUNT(*) FROM table2
    WHERE 
        table2.field1 = '0' AND
        table1.field3 = table2.field2 AND
        table1.field4 = table2.field3 AND
                table1.field5 = table2.field4 AND
        table1.field6 = table2.field5 AND
        table1.field7 = table2.field6 
    ) = 0
WITH UR

我将尝试的第一次尝试:

SELECT * FROM table1
WHERE
  table1.field1 = '9' AND
  table1.field2 <= CURRENT DATE - 1 YEAR AND
NOT EXISTS
(
   SELECT 1 FROM table2
   WHERE 
    table2.field1 = '0' AND
    table1.field3 = table2.field2 AND
    table1.field4 = table2.field3 AND
            table1.field5 = table2.field4 AND
    table1.field6 = table2.field5 AND
    table1.field7 = table2.field6 
)
WITH UR

尽管在没有模式、数据和执行计划的情况下不可能进行预测,但我会尝试的第一次尝试是:

SELECT * FROM table1
WHERE
  table1.field1 = '9' AND
  table1.field2 <= CURRENT DATE - 1 YEAR AND
NOT EXISTS
(
   SELECT 1 FROM table2
   WHERE 
    table2.field1 = '0' AND
    table1.field3 = table2.field2 AND
    table1.field4 = table2.field3 AND
            table1.field5 = table2.field4 AND
    table1.field6 = table2.field5 AND
    table1.field7 = table2.field6 
)
WITH UR

虽然在没有模式、数据和执行计划的情况下不可能进行预测,但我认为这可能更好。首先,将查询更改为使用“不存在”:

其次,确保比较使用正确的类型“9”或“9”0'还是0

第三,增加索引:

表1字段1,字段2 表2字段2、字段3、字段4、字段5、字段6、字段1
table2索引的前五个字段的顺序是任意的;然而,field1应该在他们之后。

我认为这可能更好。首先,将查询更改为使用“不存在”:

其次,确保比较使用正确的类型“9”或“9”0'还是0

第三,增加索引:

表1字段1,字段2 表2字段2、字段3、字段4、字段5、字段6、字段1

table2索引的前五个字段的顺序是任意的;但是,字段1应该在它们之后。

除非您使用适当的索引共享整个表结构,否则我们无法帮助您。如果我告诉您,表1中的字段是表1的主键,表2中的键不是键?您需要查看“解释计划”以了解数据库引擎决定如何处理数据。然后你需要决定你认为它应该怎么做。并提供可用于提高效率的访问路径。这都是学习“数据库”的一部分。如果检查不存在,则不需要选择“计数”。Use NOT EXISTS directlySide注意:日期/时间通常应以上限独占方式查询-除非您使用适当的索引共享整个表结构,否则我们无法为您提供帮助如果我告诉您表1中的字段是表1的主键,表2中的键不是键?您需要查看“解释计划”以了解数据库引擎决定如何处理数据。然后你需要决定你认为它应该怎么做。并提供可用于提高效率的访问路径。这都是学习“数据库”的一部分。如果检查不存在,则不需要选择“计数”。使用不存在的directlySide注意:日期/时间通常应以上限独占方式查询-谢谢大家的回答,我已经尝试过了,但基本相同。我以为我做错了什么,但似乎我不得不等待,谢谢:谢谢大家的回答,我已经试过了,但基本上都是一样的。我以为我做错了什么,但似乎我不得不等待,谢谢:field1不应该是表2索引中的第一列吗?@Satya-field1有一个常量意味着它是一个状态/标志字段,基数很低,并且该条件不会从整个联接产品中删除很多行。但是,当另一个表中的多个列将在优化程序试图找出行乘法将产生什么时,将考虑更多的行,所以它们首先出现。至少,我想这就是戈登想要表达的意思——我对其中一些东西有点生疏了this@Satya . . . 绝对不是。列需要先按外部表上的条件排序,然后按内部表排序-首先是与外部行的匹配,然后进行筛选。@Clockwork Muse-我问的是建议索引中列的顺序。@索引顾问DB2 LUW Gordon Linoff提出了不同的建议。在测试库中创建syscat.tables和syscat.columns的副本,并从testlib.columns c中检查sql select*的索引建议,其中c.typename='XML'不存在从testlib.tables t中选择1,其中t.type='V'和t.tabname=c.tabname和t.tabschema=c.tabschema不应该是表2索引中的第一列?@Satya-字段1有一个常量意味着它是一个状态/标志字段,基数很低,并且该条件不会从整个联接产品中删除很多行。但是,当另一个表中的多个列将在优化程序试图找出行乘法将产生什么时,将考虑更多的行,所以它们首先出现。至少,我想这就是戈登想要表达的意思——我对其中一些东西有点生疏了this@Satya . . . 绝对不是。列需要先按外部表上的条件排序,然后按内部表排序-首先是与外部行的匹配,然后进行筛选。@Clockwork Muse-我在询问建议索引中列的顺序。@Gordon Linoff,索引顾问DB2 卢提出了不同的建议。在测试库中创建syscat.tables和syscat.columns的副本,并从testlib.columns c中检查sql select*的索引建议,其中c.typename='XML'不存在从testlib.tables t中选择1,其中t.type='V'和t.tabname=c.tabname和t.tabschema=c.tabschema