sql - SQL 之间 + OR 慢
问题描述
我有一个如下查询。
select
a,
b,
c,
CAST(d as bigint) as d,
e,
document_cat,
g,
h,
i,
fiscal_year,
k,
l,
m,
n,
account,
p,
q,
r,
s,
t,
u,
v,
CONVERT(date, CONCAT(i,'01')) as [CalDate],
CASE when r='' then CONCAT(d,'-', [account],'-','X','-',[fiscal_year],'-',p)
else CONCAT(d,'-',[account],'-',[subsidiary],'-',[fiscal_year],'-',p)
end as [UQID],
CASE when r='' then [account] else CONCAT([account],'-',[r]) end as [GL]
FROM
Ledger
WHERE [company]=123456
AND (document_cat= 'CAT A' or document_cat= 'CAT B' or document_cat= 'CAT C'.....'CAT I'
)
AND (fiscal_year]=2018 or fiscal_year =2019)
AND account BETWEEN 400000 and 999999
这是一个非常慢的查询。
你能告诉我怎么做这个快吗?
我不是 DBA,我只能访问视图。
列类型如下
+--------------+-----------+
| Name | Data_Type |
+--------------+-----------+
| a | varchar |
| b | datetime |
| c | numeric |
| d | varchar |
| e | int |
| document_cat | varchar |
| g | varchar |
| i | numeric |
| fiscal_year | numeric |
| k | date |
| l | date |
| m | varchar |
| n | varchar |
| account | varchar |
| p | tinyint |
| q | varchar |
| r | varchar |
| s | varchar |
| t | varchar |
| u | varchar |
| v | varchar |
| h | varchar |
| company | varchar |
+--------------+-----------+
这是对原始问题的编辑。我已编辑代码以包含更详细的代码以及有关此代码中使用的列的数据类型的更多详细信息。
解决方案
您可以将您的OR
陈述转换为IN
陈述。它可能有助于提高 MySQL 的性能。在其他 RDBMS 中,它可能不会,但它会使您的代码更具可读性。
Select a,b,c.....x,y,z from ledger
where
company = 123456
AND document_cat IN ('CAT A','CAT B','CAT C',.....,'CAT I')
AND fiscal_year IN (2018,2019)
AND account between 400000 and 999999
推荐阅读
- ios - 在视图上调用 Present 失败并出现模态活动控制器错误
- winforms - Core 3.0 WinForms ListView 不传播事件
- spring-boot - 在令牌验证期间从资源服务器发送到身份验证服务器的确切内容在spring security oauth2中
- reactjs - 在变量 for 循环中运行反应钩子
- css - Calc 函数不适用于求幂
- python - 基维。为什么 size_hint 在小部件上不起作用?
- android - NoSuchMethodError:在 null 上调用了 getter 'idCommande'
- c++ - stringstream 清除后不接受任何数据
- java - 如何将类注入 java.lang 包
- c - 我可以取消引用整数指针的地址吗?