首页 > 解决方案 > 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   |
+--------------+-----------+

这是对原始问题的编辑。我已编辑代码以包含更详细的代码以及有关此代码中使用的列的数据类型的更多详细信息。

标签: sql

解决方案


您可以将您的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

推荐阅读