業務系統中有一張表,資料量不大20000條資料,ID為主鍵,itemid建立了索引,
CREATE TABLE [dbo].[Table](
[ID] [CHAR](38) NOT NULL,
[title] [VARCHAR](2000) NOT NULL,
[itemid] [BIGINT] NOT NULL,
[column1] [BIGINT] NOT NULL,
[column2] [BIGINT] NULL,
[column3] [VARCHAR](200) NOT NULL,
[column4] [VARCHAR](50) NULL,
[column5] [VARCHAR](60) NOT NULL,
[column6] [CHAR](36) NOT NULL,
[status] [TINYINT] NOT NULL,
[createtime] [SMALLDATETIME] NULL,
[publishtime] [SMALLDATETIME] NULL,
[parentGuid] [BIGINT] NULL)
如果條件 ITEMID 不加單引號,該陳述句查詢會執行好久,久到崩潰,才20000條資料啊。
select top 40 ID,column1,title,column2,column3,createTime from dbo.Table WHERE itemid=131016105515202255 and status=0 and ID
not in( select top 180000 ID from Table where itemid=131016105515202255 and status=0 order by createTime desc) ORDER by createTime desc
但是在ITEMID 加了單引號后,就正常了,基本上一秒就出來資料了。
select top 40 ID,column1,title,column2,column3,createTime from dbo.Table WHERE itemid='131016105515202255' and status=0 and ID
not in( select top 180000 ID from Table where itemid='131016105515202255' and status=0 order by createTime desc) ORDER by createTime desc
明明是BIGINT型別啊,為啥要加單引號才能執行效率高呢?小弟資料庫研究不深,想知道其中緣由,請知道的大神賜教。
uj5u.com熱心網友回復:
你這種分頁方式太陳舊,只有學校老師還在這么教。你用下面這種方式試下:
--1. 創建索引
CREATE INDEX IX_table_createTime ON [table](createTime)
--2. 改用 row_number 分頁
SELECT *
FROM (
SELECT
ID,
column1,
title,
column2,
column3,
createTime,
ROW_NUMBER() OVER (ORDER BY createTime DESC) AS rid
FROM dbo.Table
WHERE itemid = 131016105515202255
AND STATUS = 0
) AS tt
WHERE tt.rid>180000 AND tt.rid<=180000+40
如果你是 sqlserver2012+ 等新一點的版本, 還可以用 offset limit , 效率差不多, 但寫法更簡潔。
uj5u.com熱心網友回復:
學習了,但是我們這個是個老舊系統,客戶也不升級,架構上沒法改變。只能先這么用著了
uj5u.com熱心網友回復:
row_number只需要2005或更高版本,這個都用不了?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/49553.html
標籤:疑難問題
上一篇:在github上為go語言安裝mysql,為啥官方的有錯誤
下一篇:求助,
