【问题标题】:Tune up my sql query for better perfomance [closed]调整我的 sql 查询以获得更好的性能 [关闭]
【发布时间】:2011-05-16 01:56:17
【问题描述】:
select top 1 col1 
from table1 
order by CreatedOn desc

在 SQL Server 2005 上执行此查询需要 6 分钟。

该表包含大约 25,00,000 行,总列数为 36,但如上所示,我只是检索数据类型为 uniqueidentifier 的单个列。

所以,请帮助我进行优化,如果需要更多详细信息,请告诉我。

好吧,让我告诉你,我无法更改我的表结构或无法对索引等表进行任何更改。建议仅更改查询或不会对表结构产生影响的更改。

【问题讨论】:

  • 如果你不能创建索引,那么你就不能改进你的查询。
  • @"oracle Certified Professional" 我应该如何继续创建新表??
  • 顺便说一句,添加索引并没有真正改变一个表(尽管我并不是说这是一个琐碎的免费操作!);索引不是域对象(除非它是唯一约束)。这是一个非功能性问题
  • 你投反对票??我只是问:除了索引如何实现性能之外,至少在某种程度上。索引是微不足道的答案,我想要一些不同的东西。不明白否决票??
  • @oracle 的意思是,如果按主键排序给您与按 CreatedOn 排序相同的结果,您可以按主键排序并使用该索引(如果存在)。

标签: sql sql-server-2005 tsql query-optimization performance


【解决方案1】:

你测试了吗:

SELECT col1
FROM   table1
WHERE CreatedOn in (SELECT MAX(CreatedOn) AS col1 FROM table1)

【讨论】:

  • 这很好用(至少比这里提到的任何东西都快)!!我的 6 分钟查询在 27 秒内完成..哇!
  • 你应该仍然有一个TOP 1。多个记录可能具有相同的CreatedOn 值。
  • @Lieven,当然可以。内部子查询只会返回一个结果。但是如果MAX(CreatedOn) 值在table 中的多行中重复,那么您最终可能会得到多个结果行。
  • @Lieven,我不明白您为什么认为接受的答案不是 OP 要求的。 OP 的原始查询从最大值为CreatedOn 的行返回一个值。接受的答案从同一行返回相同的一个值,最大 CreatedOn 值。查询提供相同的结果。
  • @Sam,似乎是我的大脑进入睡眠模式时打字的情况。今晚晚些时候我会删除我的 cmets,以免我长期陷入尴尬。
【解决方案2】:

您可以尝试向 Prequel(无处不在的 SQL 代码之神和创造者)祈祷,授予您神奇的访问权限和索引能力,以便将聚集索引和非聚集索引结合到一个结构精美的表中......

【讨论】:

  • 而且只是 poof 无中生有 +1
【解决方案3】:

CreatedOn上设置索引

【讨论】:

  • 谢谢,但由于特权,我不能这样做,你能推荐别的吗。
【解决方案4】:

您是否为此表创建了索引。处理查询时增加索引以快速查找数据。

【讨论】:

  • 不,但我现在不能更改它,没有创建索引的特权。其他提示??
【解决方案5】:

CreatedOn 创建一个索引。造成延迟的原因是 CreatedOn 下单所花费的时间,在其上创建索引将解决您的问题

【讨论】:

  • 谢谢。期待与索引不同的东西。
  • @Pratik:什么都没有。再多的询问也无济于事。
  • 要么创建索引,要么更改查询
  • 一个选项是添加 where 子句来限制结果(例如每年),但这取决于业务需求以及是否可行。
【解决方案6】:

CreatedOn 上创建一个非聚集索引并包含col1

CREATE NONCLUSTERED INDEX NC_Table1_CreatedOn_I_col1
    ON Table1(CreatedOn)
        INCLUDE (col1)

如果您无法创建索引,那么您无法加快查询速度!你可以做一个不同的查询,但这不是你的问题......

【讨论】:

  • 谢谢。期待与索引不同的东西。
  • 谢谢,如果您有其他解决方案,请告诉我。
【解决方案7】:
  • 创建您自己的(临时)表,您对其拥有所有权限
  • 在 CreatedOn 上为此表创建聚集索引
  • 复制所有数据
  • 以后查询愉快

【讨论】:

    【解决方案8】:
    select min(CreatedOn) from table1
    

    如果幸运的话,SQL 会在其统计信息中包含此信息,并且很快就会得到答案。

    如果你运气不好,那么上面建议的索引是你唯一的希望。

    【讨论】:

    • select min(CreatedOn) from table1 --- 34sec select top 1 col1 from table1 order by CreatedOn desc --- 7min36sec
    • 你很幸运 :) 我的错误,它应该是 MAX(CreatedOn)。出于好奇,MAX 比 MIN 快吗?
    猜你喜欢
    • 1970-01-01
    • 2020-04-06
    • 2015-01-08
    • 2014-11-19
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-26
    相关资源
    最近更新 更多