我有两个表:
-
asset
-与id_asset,名称,股票(60k行) -
quote_close
- with id_asset, refdate, quote_close (22MM行)
我想在name和ticker中创建一个过滤器,并返回:
- id_asset <
- 名称/gh>
- 股票
- id_asset min(refdate)
- id_asset的max(refdate)
- quote_close on max(refdate) of id_asset
我写了这个查询:
WITH tableAssetFiltered AS
(
SELECT
id_asset, ticker, name
FROM
asset
WHERE
ticker LIKE ('%VALE%') AND name LIKE ('%PUT%')
)
SELECT
ast.id_asset, ast.ticker, ast.name,
xx.quote_close as LastQuote, xx.MinDate,
xx.refdate as LastDate
FROM
tableAssetFiltered ast
LEFT JOIN
(SELECT
qc.id_asset, qc.refdate, qc.quote_close, tm.MinDate
FROM
quote_close qc
INNER JOIN
(SELECT
t.id_asset, max(t.refdate) as MaxDate, min(t.refdate) as MinDate
FROM
(SELECT
qc.id_asset, qc.refdate, qc.quote_close
FROM
quote_close qc
WHERE
qc.id_asset IN (SELECT id_asset
FROM tableAssetFiltered)
) t
GROUP BY
t.id_asset) tm ON qc.id_asset = tm.id_asset
AND qc.refdate = tm.MaxDate
) xx ON xx.id_asset = ast.id_asset
ORDER BY
ast.ticker
在名称和代码中使用不同过滤器的结果如下:
-
ticker like ('%VALE%') AND name like ('%PUT%')
取00:02:28返回491行 - 对于
name like ('%PUT%')
,它需要00:00:02并返回16697行 - 使用
ticker like ('%VALE%')
,它占用00:00:02并返回1102行 - 没有点赞,它花费了00:00:03并返回51847行
我不明白的是这个查询
SELECT id_asset,ticker, name
FROM Viper.dbo.asset
WHERE ticker like ('%VALE%') AND name like ('%PUT%')
运行时间为00:00:00。
为什么一个较小的表需要更多的时间来运行?有什么办法能让它更快吗?
速度慢可能是由很多因素引起的,硬件、网络、缓存等。
为了使查询更快,1. 确保在ticker上有一个索引。
2. 在表上运行update statistics。
3.尝试找到一种方法来删除字符串开头的"%"。这是可以的:'VALE%''%VALE'