我通过连接多个表并在多个列中使用条件来编写查询。由于我们有大量数据,我需要在所有这些列上创建索引。因此该查询应使用此索引以获得更好的性能。让我知道如何为以下场景创建它?
SELECT
A.NAME,
B.SAL,
C.DATE1
FROM
A
INNER JOIN B ON A.ID = B.ID
INNER JOIN C ON B.ID1 = C.ID1
WHERE
A.STATUS1 = '0'
AND A.TOTALAMT <> 0
AND A.FLAG = 'N'
AND B.SAL > 100
AND C.DATE1 NOT IN('2008-08-08', '2009-09-09')
答案 0 :(得分:1)
这里的经验法则是在join子句和sargs中包含字段。 还有更多内容(例如聚类,选择性,覆盖,包括......),但您可以获得满足的次优结果。
尝试创建这些索引:
...运行并测试您的应用程序及其数据库访问性能。
如果您遇到问题,您可能会发现这样的事情表现得更好:
答案 1 :(得分:0)
我想和@Ozren已经写过同样的事情。但我总是在核实我所写的条件。
主键
Table A=ID
Table B=ID1
Table C=ID1
Verify uncessary where condition like
i) when sal>100 then TOTALAMT will always >0 (is it so?)
ii) what is A.STATUS1 and A.FLAG ?(like when Flag='N' then Status is always='0'
you can put such validation while insert And avoid extra where condition.
非CI
Table A (STATUS1, TOTALAMT, FLAG)
Table B (SAL)
Table C (DATE1)
Flag='N'
,则可以在此列上使用过滤索引Flag
是char(1)而不是varchar等。