 |
เทคนิคเพิ่มความเร็วในการ 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|