0

私は SQL Server 2008 を使用しており、SQL クエリは次のようになります。

select * from (
select row_number() over(PARTITION by tb01.P_USER order by tb04.P_data7 desc) Row
  ,tb01.P_USER as 'enterpriseID'
  ,tb01.P_ID as 'greenhouseID'
  ,tb01.P_NAME as 'greenhouseName'
  ,tb04.P_data1 as 'airTemp'
  ,tb04.P_data2 as 'airHi'
  ,tb04.P_data3 as 'soilTemp'
  ,tb04.P_data4 as 'soilHi'
  ,tb04.P_data5 as 'co'
  ,tb04.P_data6 as 'sun'
  ,tb04.P_data7 as 'pickingTime'
  ,tb05.P_data5 as 'params'
from TB04 tb04,TB01 tb01,TB05 tb05,TB12 tb12
 where tb04.P_data8 = tb05.P_data2 
 and tb05.P_data1=tb01.P_ID
 and tb01.P_USER = tb12.P_data1
 and tb12.CodeId = '410621'
 ) result where Row between (3-1)*20+1 and 3*20

そのうちの 20 個を選び出したいのですが、この SQL を実行すると、8 秒ほどかかりました。もちろん、これは想定外でした。

誰でも私を助けてくれますか?thx。

編集: 「tb01.P_USER による PARTITION」を削除し、そのクエリ速度を 2 倍にしました。現在、実行計画は以下にリストされています。 ここに画像の説明を入力

並べ替えには、クエリ時間の 98% がかかります。これにはどうすればよいですか? オーバー機能を削除し、必要に応じて別のより効果的な方法を使用する必要がありますか?

4

2 に答える 2

0

SQL パフォーマンスに関する完全な一連のブログ投稿があります。一部の洞察については、パート 3 とパート 4 を確認してください: http://www.karafilis.net/sql-indexing-part3/

于 2013-09-25T11:18:35.303 に答える