我们看到这些查询之间存在巨大差异.
慢查询
SELECT MIN(col) AS Firstdate, MAX(col) AS Lastdate
FROM table WHERE status = 'OK' AND fk = 4193
Run Code Online (Sandbox Code Playgroud)
表'表'.扫描计数2,逻辑读取2458969,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.
SQL Server执行时间:CPU时间= 1966 ms,已用时间= 1955 ms.
快速查询
SELECT count(*), MIN(col) AS Firstdate, MAX(col) AS Lastdate
FROM table WHERE status = 'OK' AND fk = 4193
Run Code Online (Sandbox Code Playgroud)
表'表'.扫描计数1,逻辑读取5803,物理读取0,预读取读取0,lob逻辑读取0,lob物理读取0,lob预读读取0.
SQL Server执行时间:CPU时间= 0 ms,已用时间= 9 ms.
题
查询之间巨大的性能差异之间的原因是什么?
更新 基础上给出意见的问题小更新:
执行顺序或重复执行不会改变性能.没有使用额外的参数,并且(测试)数据库在执行期间没有执行任何其他操作.
慢查询
|--Nested Loops(Inner Join)
|--Stream Aggregate(DEFINE:([Expr1003]=MIN([DBTest].[dbo].[table].[startdate])))
| |--Top(TOP EXPRESSION:((1)))
| |--Nested Loops(Inner Join, OUTER REFERENCES:([DBTest].[dbo].[table].[id], [Expr1008]) WITH ORDERED PREFETCH)
| |--Index …
Run Code Online (Sandbox Code Playgroud) 我有一个查询是定期执行的 SP 的哪一部分,该查询需要一段时间才能执行,所以我决定看一看。我对查询进行了自动跟踪,这是返回的执行计划 [由于尺寸过大而粘贴到 pastebin 中]
我在进行全表访问的表上添加了索引,并运行了查询。尽管成本显着降低,但查询性能比以前更差。
为什么会这样,任何人都可以解释一下吗?
该数据库是 Oracle 10gR2(版本 10.2.0.1.0)。
这是正在运行的查询
SELECT DISTINCT CAC_FLEX_03, CAC_FLEX_04
FROM PCOM_CUST_PRACTICE_INFO A,
PGIM_ZIP_CODES C,
PGIM_PROD_TARIFF_DATA B,
PCOM_CODES_APPL_CODES D
WHERE A.PCPI_CUST_CODE IN ('002023', '002025')
AND C.ZC_ZIP_CODE = A.PCPI_PIN_CODE
AND C.ZC_CITY_CODE = A.PCPI_CITY
AND C.ZC_COUNTY_CODE = A.PCPI_COUNTY
AND C.ZC_STATE_CODE = A.PCPI_STATE
AND B.PTD_CVR_CODE = 'TF-001'
AND B.PTD_VALUE_SET2 = A.PCPI_STATE
AND B.PTD_VALUE_SET4 = A.PCPI_COUNTY
AND B.PTD_VALUE_SET5 = D.CAC_FLEX_03
AND D.CAC_FLEX_04 IS NOT NULL
AND ZC_STATE_CODE =
(SELECT POL_FLEX_04
FROM …
Run Code Online (Sandbox Code Playgroud)