【发布时间】:2016-06-14 01:24:14
【问题描述】:
我知道有更好的方法来完成我想要完成的工作。尽管查询有效,但我担心它的性能会随着数据集的增长而受到影响。
我什至不需要有人重写我所拥有的,如果他们愿意为我指出我应该研究的主题的方向,我将不胜感激。
我试图通过此查询返回的是处于或高于某个状态的记录数的计数。
提前感谢您的帮助!
SELECT
( SELECT count(*)
FROM TABLE1 c1
WHERE ( c1.U_KEY3 NOT LIKE 'z%' AND (c1.U_KEY1 = '' or c1.U_KEY1 IS NULL) )
) AS 'STATUS is EMPTY'
,
( SELECT count(*)
FROM TABLE1 c1
WHERE ( c1.U_KEY3 NOT LIKE 'z%' AND LEFT(c1.U_KEY1,2) >= '70' )
) AS 'STATUS > 70'
,
( SELECT count(*)
FROM TABLE1 c1
WHERE ( c1.U_KEY3 NOT LIKE 'z%' AND LEFT(c1.U_KEY1,2) >= '50' )
) AS 'STATUS > 50'
,
( SELECT count(*)
FROM TABLE1 c1
WHERE ( c1.U_KEY3 NOT LIKE 'z%' AND LEFT(c1.U_KEY1,2) >= '30' )
) AS 'STATUS > 30'
,
( SELECT count(*)
FROM TABLE1 c1
WHERE ( c1.U_KEY3 NOT LIKE 'z%' AND LEFT(c1.U_KEY1,2) >= '10' )
) AS 'STATUS > 10'
【问题讨论】:
-
TABLE1上有索引吗?查询的运行速度可能比您想象的要快。 -
表格有多少行?你试过用 JOIN 代替子查询吗?
-
@Tim U_KEY 字段被索引。表中现在只有 1200 行,运行良好,但有可能增长到 100,000 行。
-
@FLICKER 没有尝试加入。你是说加入表本身吗?
-
我准备在这里犯错,但我认为改进的空间不大。
COUNT查询必须扫描在WHERE子句之后保留的所有记录,而您实际上是在 5 个不同的查询中执行此操作。但是对于 10 万条记录,您真的关心性能吗?您希望多久在生产环境中运行一次此查询?