none
Insert语句能用order by排序吗? RRS feed

  • 问题

  • 在插入的时候就排好顺序,这样查询时就不用再排序了。这个想法很好,只是不知道,能不能排序并保存到数据库里。

     

     

    INSERT INTO client (id, message) VALUE (@number, @content) ORDER BY id

     

     

     

    这个存储过程能用来排序吗?还是说,设置数据表,让它自动排序?

    2008年12月13日 10:30

答案

  • Insert into ...vales--不可用order by

    select 時顯示;用建索引的方式

    create index IX_T on T(ID)--默認為asc
    2008年12月13日 10:33
    版主
  • 这里有三个顺序:

    (1)插入数据的顺序;

    (2)数据存储的顺序;和

    (3)数据检索出来的顺序。

     

    这三个顺序之间有一定的区别,也有联系。明白他们的关系就可以更好的处理你的需求:

    (1)如果表具有clustered index,那么数据是按主键顺序存放,和插入顺序无关;

    (2)如果表没有clustered index,那么数据可能是按插入的顺序存放,也可能不是(例如被删除的行的重用问题等。);

    (3)数据检索结果的顺序是由order by字句决定的;如果没有order by字句,由使用的索引顺序决定。

     

    在SQL Server执行select的时候,order by子句是可以优化的:例如使用的索引顺序和order by的要求一样,那么order by就不会执行,也就是没有开销。

     

    如果你的表只是用于插入数据而不会有数据删除(例如历史数据),也没有任何索引,那么存储顺序和插入顺序是一样的。这样检索的时候,就不需要指定order by字句,也就是达到你的目的。否则,如楼上所说的,比较好的方式是使用索引和order by,由SQL Server去处理。

    2008年12月13日 11:39
  •  dvdvip 写:

    使用索引不会影响速度吗?

     

     

    我就是想让访问者在一个数据表里插入ID号和留言。ID号会有很多相同的。不同的ID号之间按大小排列,相同的ID号之间按时间顺序排列,如:

     

    ID                  message                        time

     

    00001            Hello!                             01:02

    00001            Good Luck!                  03:24

    00001            OK!                                 05:23

    00002            My God!                        01:22

    00002            Hi!                                  05:45

    00002            You are stupid.           07:23

    00003            I am a girl.                    02:21

    00003            Wow!                             12:56          

    00004            Give me money           07:12

    00004            Nice!                              11:19

     

     

    这个排列的顺序,能实现吗?

    1:理论上,索引提高了查询的效率,肯定是要降低插入数据的效率的,但其实实际应用中,大多数情况下

    肯定是该要建立索引提高查询的,还是要建立,毕竟查询的情况远远大于插入的情况。

     

    2:对于你的这个需求的排序,你是可以按照第一排序,第二排序来实现,即语句如下:

     

    SELECT

       *  --你也可以列出你的列名

    FROM Table

    ORDER BY ID   --先按ID排序

    ,time           --再按相同ID的时间排序(这里换行是为了更好的说明)

    2008年12月13日 14:38
    版主
  • 索引对插入数据会有一定的影响,但是对检索有帮助。所以要看你的应用:是插入的速度要求很高,还是检索速度要求很高,还是都需要。

     

    你这个要求,实现的方法太多了。我建议你先用标准方法实现(表+(ID,TIME)上的clustered index)。然后如果发现有性能问题,再考虑其他的措施。

     

    2008年12月13日 14:40

全部回复

  • Insert into ...vales--不可用order by

    select 時顯示;用建索引的方式

    create index IX_T on T(ID)--默認為asc
    2008年12月13日 10:33
    版主
  • 这里有三个顺序:

    (1)插入数据的顺序;

    (2)数据存储的顺序;和

    (3)数据检索出来的顺序。

     

    这三个顺序之间有一定的区别,也有联系。明白他们的关系就可以更好的处理你的需求:

    (1)如果表具有clustered index,那么数据是按主键顺序存放,和插入顺序无关;

    (2)如果表没有clustered index,那么数据可能是按插入的顺序存放,也可能不是(例如被删除的行的重用问题等。);

    (3)数据检索结果的顺序是由order by字句决定的;如果没有order by字句,由使用的索引顺序决定。

     

    在SQL Server执行select的时候,order by子句是可以优化的:例如使用的索引顺序和order by的要求一样,那么order by就不会执行,也就是没有开销。

     

    如果你的表只是用于插入数据而不会有数据删除(例如历史数据),也没有任何索引,那么存储顺序和插入顺序是一样的。这样检索的时候,就不需要指定order by字句,也就是达到你的目的。否则,如楼上所说的,比较好的方式是使用索引和order by,由SQL Server去处理。

    2008年12月13日 11:39
  • 使用索引不会影响速度吗?

     

     

    我就是想让访问者在一个数据表里插入ID号和留言。ID号会有很多相同的。不同的ID号之间按大小排列,相同的ID号之间按插入顺序或时间顺序排列,如:

     

    ID                  message                        time

     

    00001            Hello!                             01:02

    00001            Good Luck!                  03:24

    00001            OK!                                 05:23

    00002            My God!                        01:22

    00002            Hi!                                  05:45

    00002            You are stupid.           07:23

    00003            I am a girl.                    02:21

    00003            Wow!                             12:56          

    00004            Give me money           07:12

    00004            Nice!                              11:19

     

     

    这个排列的顺序,能实现吗?

    2008年12月13日 14:21
  •  dvdvip 写:

    使用索引不会影响速度吗?

     

     

    我就是想让访问者在一个数据表里插入ID号和留言。ID号会有很多相同的。不同的ID号之间按大小排列,相同的ID号之间按时间顺序排列,如:

     

    ID                  message                        time

     

    00001            Hello!                             01:02

    00001            Good Luck!                  03:24

    00001            OK!                                 05:23

    00002            My God!                        01:22

    00002            Hi!                                  05:45

    00002            You are stupid.           07:23

    00003            I am a girl.                    02:21

    00003            Wow!                             12:56          

    00004            Give me money           07:12

    00004            Nice!                              11:19

     

     

    这个排列的顺序,能实现吗?

    1:理论上,索引提高了查询的效率,肯定是要降低插入数据的效率的,但其实实际应用中,大多数情况下

    肯定是该要建立索引提高查询的,还是要建立,毕竟查询的情况远远大于插入的情况。

     

    2:对于你的这个需求的排序,你是可以按照第一排序,第二排序来实现,即语句如下:

     

    SELECT

       *  --你也可以列出你的列名

    FROM Table

    ORDER BY ID   --先按ID排序

    ,time           --再按相同ID的时间排序(这里换行是为了更好的说明)

    2008年12月13日 14:38
    版主
  • 索引对插入数据会有一定的影响,但是对检索有帮助。所以要看你的应用:是插入的速度要求很高,还是检索速度要求很高,还是都需要。

     

    你这个要求,实现的方法太多了。我建议你先用标准方法实现(表+(ID,TIME)上的clustered index)。然后如果发现有性能问题,再考虑其他的措施。

     

    2008年12月13日 14:40