使用参数更快地进行 T-Sql 查询

大佬

首先我想说我真的是数据库初学者,不要评判我。

我从网络服务接收了很多参数,我必须使用这些参数进行 sql 查询。问题是我的查询消耗了大量的 cpu,因为我对查询的优化很差。

  SELECT 
  SUM(t.total_amount) as SumaAmount,
  COUNT(t.id)  as TotalTransaccions

    FROM RealTimeVending.dbo.rtv_turnover_transaction as t, 
    RealTimeVending.dbo.rtv_trans_articles as ta,
    RealTimeVending.dbo.articles as art, RealTimeVending.dbo.groups,
    RealTimeVending.dbo.Clients as s,
    RealTimeVending.dbo.rtv_transactions as tr, 
    RealTimeVending.dbo.tills as till, RealTimeVending.dbo.Ubicacion as u, 
    RealTimeVending.dbo.Operadores as o 

    where t.operador_id=o.ID and t.transaction_id=ta.transaction_id and 
    art.id=ta.article_id and s.id=t.cliente_id and tr.id=t.transaction_id 
    and groups.id=art.group_a_id and t.ubicacio_id=u.id 

    and convert(date,t.trans_date) >='"+globalMap.get("datainici")+"'and 
    convert(date,t.trans_date) <= '"+globalMap.get("datafinal")+"'and 
    and (s.codigo IS NULL or s.codigo like '%"+globalMap.get("client")+"%') 
    and (t.total_amount IS NULL or t.total_amount like'"+globalMap.get("amount")+"%') 

想象一下,我将 Web 服务中的所有参数都设为空。数据库会在这些参数上花费大量时间。我想做的是一个查询,我可以在其中搜索不为空的参数。例如,如果“t.total_amount”为空,我不想在查询中插入搜索。

我希望你明白我的问题。非常感谢。

理查德·汉塞尔

这是使用现代JOIN语法快速重写您的查询

SELECT 
  SUM(t.total_amount) AS SumaAmount,
  COUNT(t.id) AS TotalTransaccions
FROM 
    RealTimeVending.dbo.rtv_turnover_transaction t
    INNER JOIN RealTimeVending.dbo.rtv_trans_articles ta ON ta.transaction_id = t.transaction_id
    INNER JOIN RealTimeVending.dbo.articles art ON art.id = ta.article_id
    INNER JOIN RealTimeVending.dbo.groups g ON g.id = art.group_id
    INNER JOIN RealTimeVending.dbo.Clients s ON s.id = t.cliente_id
    INNER JOIN RealTimeVending].dbo.rtv_transactions tr ON tr.id = t.transaction_id
    --INNER JOIN RealTimeVending.dbo.tills till (not used)
    INNER JOIN RealTimeVending.dbo.Ubicacion u ON u.id = t.ubicacio_id 
    INNER JOIN RealTimeVending.dbo.Operadores o ON o.id = t.operador_id
WHERE
    CONVERT(DATE, t.trans_date) >= '"+globalMap.get("datainici")+"' --is this really not already a date?
    AND CONVERT(DATE, t.trans_date) <= '"+globalMap.get("datafinal")+"'
    AND (s.codigo IS NULL or s.codigo LIKE '%"+globalMap.get("client")+"%') 
    AND (t.total_amount IS NULL or t.total_amount LIKE '"+globalMap.get("amount")+"%');

让我印象深刻的第一件事是您trans_date正在转换为 aDATE进行比较,这可能效率低下。如果您可以将此标准更改为类似的内容t.trans_date BETWEEN <dateinici> AND <datefinal>,那会更好,因为这将允许使用索引。

您确实应该正确使用参数,因为这有助于避免 SQL 注入。

取决于优化器,它应该意识到如果一个值是NULL并且你有一个约束,那么比较它是没有意义x IS NULL OR x LIKE <something>

可能值得进行示例查询并查看它使用的执行计划?

使用现代JOIN语法,很明显你的tills表没有被使用,所以本质上是 a CROSS JOIN,如果它是一个大表,它会减慢一切吗?

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章