เทคนิคเพิ่มความเร็วในการ Query T-SQL ลำดับขอบเครื่องหมาย มีผลในการค้นหาเป็นอย่างมาก
ในกรณีที่เราต้องใช้ SUBSTRING ในการค้นหาอะไรซักอย่าง เช่น
where substring(firstname,1,1) = 'm'
เราควรที่จะเปลี่ยนเป็น
where firstname like 'm%'
เพราะว่า Substring เป็น Function ทำให้รันได้ช้ากว่า
อาจจะช่วยได้อย่างละนิด อย่างละหน่อยนะครับ
Date :
2009-07-17 15:05:53
By :
taobsd
ข้อห้ามสำหรับการใส่เงื่อนไขที่ ไม่ได้ทำ Index ก็คือไม่ควรใส่ Function ที่ ฟิลด์นั้น
ยกตัวอย่าง
เราต้องการหาอายุที่มากกว่า 21 ปี
ส่วนมากจะเป็น
SELECT MEMBER_NUMBER,FIRST_NAME,LAST_NAME
FROM MEMBERS
WHERE DATEDIFF(YY,DATOFBIRTH,GETDATE()) > 21
ซึ่งจำทำให้ช้า เพราะ Datofbirth ไม่ได้ทำ Index ไว้
เราลองมาเปลี่ยนนิดหน่อยสิจะดีขึ้น
SELECT MEMBER_NUMBER,FIRST_NAME,LAST_NAME
FROM MEMBERS
WHERE DATEOFBIRTH < DATEADD(YY,-21,GETDATE())
ได้ผลเหมือนกัน ลองเอาไปปรับใช้ดูนะครับ
Date :
2009-07-20 08:01:54
By :
taobsd
การใช้ IN กับ BETWEEN
ในกรณีที่เรารู้ข้อมูลแน่นอน และมีการเรียงของข้อมูล
เช่น
SELECT CUSTOMER_NUMBER,CUSTOMER_NAME
FROM CUSTOMER
WHERE CUSTOMER_NUMBER IN (1000,1001,1002)
กับ
SELECT CUSTOMER_NUMBER,CUSTOMER_NAME
FROM CUSTOMER
WHERE CUSTOMER_NUMBER BETWEEN 1000 AND 1002
แบบใช้ BETWEEN จะมีการ Query ได้เร็วกว่า
Date :
2009-07-20 13:19:19
By :
taobsd
ขอบคุณมากครับ ++
ว่าแต่ T-SQL คืออะไรคับ
Date :
2009-07-21 19:15:01
By :
pjgunner
T-SQL ก็คือ Transact-SQL ที่ใช้กับ MSSQL ซะส่วนใหญ่ครับ
แต่ก็เป็นพื้นฐาน ที่เอาไปเทียบใช้กับ ยี่ห้ออื่น ๆ ก็ได้ครับ
Date :
2009-07-22 07:40:16
By :
taobsd
วันนี้เรามาดูเทคนิคเพิ่มเติมระหว่าง OR กับ UNION ALL กัน
ในกรณีที่เรา ใช้ OR ในส่วนของเงื่อนไข เยอะ ๆ จะทำให้ Query ช้าลงมาก ๆ เช่น
SELECT EMPLOYEEID,FIRSTNAME, LASTNAME
FROM EMPLOYEE
WHER DEPT = 'IT' OR CITY = 'UDONTHANI' OR DIVISION = 'SUPPORT'
เราสามารถใช้การ UNION ALL เพื่อเพิ่มความเร็วในการ Query ได้
SELECT EMPLOYEEID,FIRSTNAME, LASTNAME
FROM EMPLOYEE
WHER DEPT = 'IT'
UNION ALL
SELECT EMPLOYEEID,FIRSTNAME, LASTNAME
FROM EMPLOYEE
WHER CITY = 'UDONTHANI'
UNION ALL
SELECT EMPLOYEEID,FIRSTNAME, LASTNAME
FROM EMPLOYEE
WHER DIVISION = 'SUPPORT'
อย่างนี้ จะเพิ่มประสิทธิภาพในการ Query ได้นะครับ
หวังว่าคงช่วยได้ไม่มากก็น้อยนะครับ
Date :
2009-07-22 07:50:10
By :
taobsd
thank เอาอีกๆ
Date :
2009-07-22 10:16:11
By :
naskw
ขยันเขียนจริงครับ นับถือๆ
Date :
2009-07-22 12:19:46
By :
teez1232002
เก่ง SQL จริงๆ ผมเองก็ใช้ซินแท็คเป็นไม่กี่อัน เอง
Date :
2009-07-23 09:09:44
By :
pjgunner
ไม่หรอกครับ
ผมคิดว่า อะไรที่ทำให้ได้ก็ช่วย ๆ กันครับ
ผมไม่ได้เก่งอะไรครับ
เขียนโปรแกรมไม่เก่งครับ
ได้ก็แต่ Query เท่านั้นละครับ
ที่ได้ลองเยอะเท่านั้นเองครับ
ก็เลยอยากเอามาแชร์ครับ เป็นความรู้ให้รุ่นน้องต่อไปครับ
Date :
2009-07-23 10:39:52
By :
taobsd
วันนี้เรามาดูเกี่ยวกับ Group by กับ DISTINCT ว่าจะช่วยให้ Query เราเร็วขึ้นสักนิดได้หรือป่าว
ในกรณีที่ เราไม่มี เงื่อนไขในการ Query Group by เป็นทางเลือกที่ใช้ในการ Query ได้เร็วกว่า DISTINCT
แต่ถ้าเกิดว่าเรามีเงื่อนไขในการ Query แล้วละก็ เราควรเปลี่ยนมาใช้ DISTINCT จะดีกว่า
ลองมาดูตัวอย่างกันนะครับ
USE Northwind
SELECT ORDERID
FROM [ORDER DETAILS]
WHERE UNITPRICE > 10
GROUP BY ORDERID
กับ
USE Northwind
SELECT DISTINCT ORDERID
FROM [ORDER DETAILS]
WHERE UNITPRICE > 10
ลองไปทดลองกันได้นะครับ
แล้วพบกันใหม่
Date :
2009-07-23 10:48:52
By :
taobsd
ช่วงนี้ยุ่งจิง ๆ ครับ งานเยอะมาก ๆ เลย
วันนี้เรามาดูสิว่า นอกจากการ Count(*) แล้ว
ยังมีวิธีไหนที่จะ Count ได้เร็วขึ้นอีก
USE Northwind
SET STATISTICS IO ON
GO
SELECT count(*) FROM [order Details]
GO
SELECT rows FROM sysindexes WHERE id = OBJECT_ID('order Details') AND indid < 2
GO
SET STATISTICS IO OFF
GO
แล้วลองดูผลลัพธ์ดูนะครับ ยิ่งตัวเลขน้อย ยิ่งเร็ว
แล้วพบกันใหม่
Date :
2009-07-27 16:07:09
By :
taobsd
ช่วงนี้ยุ่งจิง ๆ ครับ งานเยอะมาก ๆ เลย
วันนี้เรามาดูสิว่า นอกจากการ Count(*) แล้ว
ยังมีวิธีไหนที่จะ Count ได้เร็วขึ้นอีก
USE Northwind
SET STATISTICS IO ON
GO
SELECT count(*) FROM [order Details]
GO
SELECT rows FROM sysindexes WHERE id = OBJECT_ID('order Details') AND indid < 2
GO
SET STATISTICS IO OFF
GO
แล้วลองดูผลลัพธ์ดูนะครับ ยิ่งตัวเลขน้อย ยิ่งเร็ว
แล้วพบกันใหม่
Date :
2009-07-27 16:10:29
By :
taobsd
+ ให้เลย มาเรื่อยๆ นะครับ
Date :
2009-07-27 22:19:18
By :
plakrim
ขอบคุณครับ จะพยายาม
เอาประสบการณ์มาแชร์กันเรื่อย ๆ นะครับ
ขอบคุณสำหรับทุกคะแนนครับ
Date :
2009-07-28 08:33:17
By :
taobsd
วันนี้เรามาดูว่า UNION กับ UNION ALL ต่างกันอย่างไร
แล้วแบบไหนเร็วกว่ากัน
UNION นั้น เป็นการ Join กันระหว่าง 2 Table ที่มี Columns เหมือนกันทั้งหมด
และจะมีการหาข้อมูลซ้ำ เอามาโชว์แค่ตัวเดียว
UNION ALL นั้น ก็เป็นการ Join เหมือนกับ UNION แต่จะไม่มีการหาข้อมูลซ้ำ
ซึ่งก็จะทำให้การ Join กันเร็วขึ้น ในกรณีที่เราไม่สนใจว่าข้อมูลเราจะซ้ำหรือป่าว
ผลลัพท์ที่ออกมาก็จะออกมาทั้งหมดจิง ๆ
ลองเอาไปประยุกต์ใช้ดูได้นะครับบบบบบ
Date :
2009-07-28 10:05:21
By :
taobsd
อยากให้ เป็น MySQL อ่ะคับ ถึงจะเข้าใจ พอดี ไม่ถูกกะ M$ เท่าไหร่
ไม่ก็ standard sql ก็ได้คับ สอนซินแท็คด้วยก็ดี
Date :
2009-07-28 21:53:32
By :
pjgunner
พอดีผมไม่ค่อยเก่ง MYSQL ครับ
แต่บางตัวก็เป็น Basic ของ SQL อะครับ
นำไปประยุกต์ใช้น่าจะได้
ต้องขอโทษทีนะครับ
Date :
2009-07-29 08:07:42
By :
taobsd
ไม่เป็นไรไม่ต้องขอโทษครับ
Date :
2009-07-29 09:53:57
By :
pjgunner
พ่อพระมาโปรด พวกเราแล๊ว! เย๊ๆๆ
Date :
2009-07-29 10:50:34
By :
paphun
ผู้น้อยขอคาราวะ 1 จอก 2จอก 3 จอก ...
พอดีกว่าเดี๋ยวจะเมาจะไม่ได้มาเขียนต่อ อิอิอิ
Date :
2009-07-29 13:09:01
By :
zepherus
วันนี้เรามาดู Truncate กับ Delete
Truncate จะมีการลบข้อมูลที่เร็วกว่า Delete
ในกรณีที่ ต้องการลบข้อมูลทั้งหมด ใน Table
Date :
2009-07-31 08:31:31
By :
taobsd
การใช้ IN กับ BETWEEN
ในกรณีที่เรารู้ข้อมูลแน่นอน และมีการเรียงของข้อมูล
เช่น
SELECT CUSTOMER_NUMBER,CUSTOMER_NAME
FROM CUSTOMER
WHERE CUSTOMER_NUMBER IN (1000,1001,1002)
กับ
SELECT CUSTOMER_NUMBER,CUSTOMER_NAME
FROM CUSTOMER
WHERE CUSTOMER_NUMBER BETWEEN 1000 AND 1002
แบบใช้ BETWEEN จะมีการ Query ได้เร็วกว่า
=============================================================
ดูเหมือนจะดีครับ
แต่ในความเป็นจริงแล้วการเขียนโปรแกรมเรานึกถึง การเขียนให้สามารถ reuse ได้ง่าย
ดังนั้นควรจะใช้ IN นะครับ
Date :
2010-08-19 15:52:57
By :
ปากหมาน
+1
Date :
2010-08-19 16:08:19
By :
Mr.Poo
+1
Date :
2012-10-12 10:37:20
By :
OAT
+1
Date :
2015-03-23 16:57:24
By :
pond
Load balance : Server 02