คำถามติดแท็ก optimization

ในบริบทของฐานข้อมูลการปรับให้เหมาะสมหมายถึงกระบวนการของเครื่องมือเพิ่มประสิทธิภาพคิวรีที่เลือกแผนการดำเนินการทางกายภาพที่มีประสิทธิภาพ

1
ดัชนีไม่ได้ใช้กับ `= any () 'แต่ใช้กับ` in'
ตารางtมีสองดัชนี: create table t (a int, b int); create type int_pair as (a int, b int); create index t_row_idx on t (((a,b)::int_pair)); create index t_a_b_idx on t (a,b); insert into t (a,b) select i, i from generate_series(1, 100000) g(i) ; ไม่มีการใช้ดัชนีกับanyผู้ประกอบการ: explain analyze select * from t where (a,b) = …

2
ปัญหาประสิทธิภาพการทำงานของ MySQL โดยใช้คอลัมน์วันที่จัดทำดัชนี
ฉันพยายามที่จะแก้ปัญหาต่อไปนี้เป็นเวลาประมาณหนึ่งชั่วโมงในขณะนี้และยังไม่ได้รับเพิ่มเติมด้วย โอเคฉันมีโต๊ะ (MyISAM): +---------+-------------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +---------+-------------+------+-----+-------------------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | http | smallint(3) | YES | MUL | 200 | | | elapsed | float(6,3) | NO | …

6
แผนปฏิบัติการช้าสำหรับ Proc ที่เก็บไว้
ฉันกำลังพยายามที่จะเข้าใจปัญหาที่เรามีกับ SQL Server 2000 เราเป็นเว็บไซต์ที่ทำธุรกรรมปานกลางและเรามี proc ที่เก็บไว้sp_GetCurrentTransactionsซึ่งเรียกว่ารับรหัสลูกค้าและสองวัน ตอนนี้ขึ้นอยู่กับวันที่และลูกค้าแบบสอบถามนี้สามารถส่งคืนอะไรก็ได้จากศูนย์ถึง 1,000 แถว ปัญหา: สิ่งที่เราพบคือทันใดนั้นเราจะได้รับข้อผิดพลาดจำนวนมาก (โดยทั่วไปExecution Timeout Expiredหรือคล้ายกัน) สำหรับลูกค้าเฉพาะขณะที่พวกเขาลองดำเนินการ proc ที่เก็บไว้ ดังนั้นเราตรวจสอบแบบสอบถามเรียกใช้ใน SSMS และพบว่าใช้เวลา 30 วินาที ดังนั้นเราจึงคอมไพล์ proc ที่เก็บไว้และ -bang- อีกครั้งมันทำงานใน 300ms ฉันได้พูดคุยกับ DBA ของเราเกี่ยวกับเรื่องนี้แล้ว เขาบอกฉันว่าฐานข้อมูลสร้างแผนแบบสอบถามเมื่อเราสร้าง proc ที่เก็บไว้ เขาบอกว่ามันเป็นแผนการที่ดีสำหรับชุดของพารามิเตอร์นั้น แต่ถ้าคุณโยนชุดของพารามิเตอร์ที่กำหนดไว้แผนจะไม่เป็นแผนการที่ดีที่สุดสำหรับข้อมูลนั้นและคุณจะเห็นว่ามันทำงานช้า ตัวเลือกที่นำเสนอให้ฉันคือการย้ายที่แบบสอบถามปัญหาจาก proc ที่เก็บไว้และกลับสู่ SQL แบบไดนามิกที่มีแผนการดำเนินการที่สร้างขึ้นในการทำงานทุกครั้ง มันให้ความรู้สึกเหมือนย้อนกลับไปหาฉันและฉันรู้สึกว่าต้องมีวิธีแก้ไข มีวิธีอื่นในการจัดการกับปัญหานี้หรือไม่? คำตอบใด ๆ และทั้งหมดได้รับการชื่นชม

5
วิธีเพิ่มประสิทธิภาพ SELECT ช้ามากด้วย LEFT JOIN บนตารางขนาดใหญ่
ฉัน googling ให้การศึกษาด้วยตนเอง & กำลังมองหาวิธีแก้ปัญหาเป็นเวลาหลายชั่วโมง แต่ไม่มีโชค ฉันพบคำถามที่คล้ายกันสองสามข้อที่นี่ แต่ไม่ใช่กรณีนี้ ตารางของฉัน: คน (ประมาณ 10M แถว) แอตทริบิวต์ (สถานที่, อายุ, ... ) ลิงก์ (M: M) ระหว่างบุคคลและแอตทริบิวต์ (ประมาณ 40M แถว) ดัมพ์เต็ม ~ 280MB สถานการณ์: ฉันพยายามเลือกรหัสบุคคลทั้งหมด ( person_id) จากบางสถานที่ ( location.attribute_value BETWEEN 3000 AND 7000) เป็นเพศ ( gender.attribute_value = 1) เกิดในบางปี ( bornyear.attribute_value BETWEEN 1980 AND …

3
ทำไม MySQL ไม่สนใจดัชนีแม้จะมีผลบังคับใช้สำหรับการสั่งซื้อนี้ด้วย?
ฉันทำงานEXPLAIN: mysql> explain select last_name from employees order by last_name; +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+------+---------------+------+---------+------+-------+----------------+ | 1 | SIMPLE | employees | ALL | NULL | NULL | NULL | NULL | …

3
คำแนะนำเกี่ยวกับ cardinality ของ SQL Server
มีวิธีการ 'ฉีด' การประมาณค่าเชิงปริมาณให้กับเครื่องมือเพิ่มประสิทธิภาพ SQL Server (ทุกรุ่น) หรือไม่? เช่นสิ่งที่คล้ายกับคำใบ้สำคัญของออราเคิล แรงจูงใจของฉันถูกขับเคลื่อนโดยบทความเครื่องมือเพิ่มประสิทธิภาพการค้นหาดีแค่ไหนจริงเหรอ? [1]ซึ่งพวกเขาทดสอบอิทธิพลของตัวประมาณความสำคัญต่อการเลือกแผนที่ไม่ดี ดังนั้นมันจะเพียงพอหากฉันสามารถบังคับให้ SQL Server 'ประมาณการ' สำคัญ ๆ อย่างแม่นยำสำหรับการสืบค้นที่ซับซ้อน [1] Leis, Viktor, et al. "เครื่องมือเพิ่มประสิทธิภาพข้อความค้นหาดีแค่ไหนจริง ๆ " การดำเนินการของ VLDB Endowment 9.3 (2015): 204-215

1
ทำไมข้อความค้นหา sqlite นี้ช้าลงมากเมื่อฉันสร้างดัชนีคอลัมน์
ฉันมีฐานข้อมูล sqlite ที่มีสองตารางแต่ละแถวมี 50,000 แถวมีชื่อ (คน) ปลอม ฉันได้สร้างแบบสอบถามง่ายๆเพื่อค้นหาจำนวนชื่อที่มี (ชื่อที่กำหนด, ชื่อกลาง, นามสกุล) ที่ใช้ร่วมกันสำหรับทั้งสองตาราง: select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial; เมื่อไม่มีดัชนียกเว้นในคีย์หลัก (ไม่เกี่ยวข้องกับแบบสอบถามนี้) มันจะทำงานอย่างรวดเร็ว: [james@marlon Downloads] $ time sqlite3 generic_data_no_indexes.sqlite "select count(*) from fakenames_uk inner join fakenames_usa on fakenames_uk.givenname=fakenames_usa.givenname and fakenames_uk.surname=fakenames_usa.surname and fakenames_uk.middleinitial=fakenames_usa.middleinitial;" 131 real 0m0.115s …

4
ดีไม่ดีหรือไม่แยแส: WHERE 1 = 1
เมื่อให้คำถามนี้กับ reddit ฉันได้ล้างคิวรีเพื่อชี้ให้เห็นว่าปัญหาอยู่ที่ไหนในเคียวรี ฉันใช้เครื่องหมายจุลภาคก่อนและWHERE 1=1ทำให้การสืบค้นแก้ไขง่ายขึ้นดังนั้นโดยทั่วไปแล้วข้อความค้นหาของฉันจะเป็นดังนี้: SELECT C.CompanyName ,O.ShippedDate ,OD.UnitPrice ,P.ProductName FROM Customers as C INNER JOIN Orders as O ON C.CustomerID = O.CustomerID INNER JOIN [Order Details] as OD ON O.OrderID = OD.OrderID INNER JOIN Products as P ON P.ProductID = OD.ProductID Where 1=1 -- AND O.ShippedDate Between '4/1/2008' And …

4
การเข้าร่วมได้รับการปรับให้เหมาะสมกับส่วนคำสั่งที่ runtime หรือไม่
เมื่อฉันเขียนแบบสอบถามเช่นนี้ ... select * from table1 t1 join table2 t2 on t1.id = t2.id เครื่องมือเพิ่มประสิทธิภาพ SQL ไม่แน่ใจว่าเป็นคำที่ถูกต้องแปลว่าเป็น ... select * from table1 t1, table2 t2 where t1.id = t2.id โดยพื้นฐานแล้วคำสั่งเข้าร่วมใน SQL Server เป็นวิธีที่ง่ายกว่าในการเขียน sql หรือไม่ หรือใช้จริงในเวลาทำงาน? แก้ไข: ฉันเกือบจะตลอดและจะใช้เข้าร่วมไวยากรณ์ ฉันแค่อยากรู้ว่าเกิดอะไรขึ้น

4
เป็นไปได้ไหมที่จะเพิ่มประสิทธิภาพการสืบค้นในตารางแคบ ๆ ที่มีแถวนับล้านแถว
ฉันมีข้อความค้นหาที่ใช้เวลาโดยเฉลี่ย 2,500 มิลลิวินาทีในการดำเนินการให้เสร็จสมบูรณ์ ตารางของฉันแคบมาก แต่มี 44 ล้านแถว ฉันมีตัวเลือกอะไรบ้างในการปรับปรุงประสิทธิภาพหรือตัวเลือกนี้ดีเท่าที่ได้รับ คำค้นหา SELECT TOP 1000 * FROM [CIA_WIZ].[dbo].[Heartbeats] WHERE [DateEntered] BETWEEN '2011-08-30' and '2011-08-31'; โต๊ะ CREATE TABLE [dbo].[Heartbeats]( [ID] [int] IDENTITY(1,1) NOT NULL, [DeviceID] [int] NOT NULL, [IsPUp] [bit] NOT NULL, [IsWebUp] [bit] NOT NULL, [IsPingUp] [bit] NOT NULL, [DateEntered] [datetime] NOT NULL, …

5
ฉันจะค้นหามุมมองบันทึก 20 ล้านรายการนี้เร็วขึ้นได้อย่างไร
สำหรับฟังก์ชั่นการค้นหาฉันใช้มุมมองที่มีระเบียนจากตารางทั้งหมดที่ฉันต้องการค้นหา มุมมองมีเกือบ 20 ล้านบันทึก การค้นหามุมมองนี้ใช้เวลานานเกินไป ฉันควรปรับปรุงการทำงานของมุมมองนี้ที่ไหน คำจำกัดความคร่าวๆสำหรับมุมมองด้านล่าง ประกอบด้วยสิบสามตารางและรอบ ๆ สามสิบฟิลด์ CREATE VIEW [dbo].[v_AllForSearch] AS SELECT FT.firstField AS [firstField] , FT.fld_primary AS [fld_primary] , FT.fld_thirdField AS [thirdField] , FT.fld_fourthField AS [fourthField] , ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField] , ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch , ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch , ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch , ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch] , ISNULL(FRT.[fld_seventhSearch],'') …

5
บังคับให้ SQL Server รันเงื่อนไขการสืบค้นตามที่เขียนไว้หรือไม่
ฉันใช้ SQL Server 2008 R2 และฉันมีแบบสอบถามหลอก (SP) นี้: select ... from ... WHERE @LinkMode IS NULL AND (myColumn IN (...very long-running query...)) ... ... ปัญหาคือว่าแบบสอบถามใช้เวลานานมากในการดำเนินการ - แม้ว่าผมจะดำเนินการ SP @LinkMode=2ด้วย ดังที่คุณสังเกตเห็นเคียวรีที่รันนานควรถูกเรียกใช้งานต่อเมื่อ @LinkMode เป็นโมฆะซึ่งไม่ใช่กรณีที่นี่ ในกรณีของฉัน @LinkMode = 2! อย่างไรก็ตามหากฉันเปลี่ยนเป็น: select ... from ... WHERE 1=2 AND (myColumn IN (...very long time exeted …

1
การประมาณค่าСardinalityของภาคที่ครอบคลุมบางส่วน
ในขณะนี้ฉันกำลังพยายามหาวิธีที่ SQL Server จะประเมินความสำคัญของช่วงของเพรดิเคตที่ครอบคลุมขั้นตอนฮิสโตแกรมบางส่วน บนอินเทอร์เน็ตด้วยความคิดเชิงสถิติสำหรับการคำนวณแบบตามลำดับขั้นและสถิติที่มีค่าฉันพบคำถามที่คล้ายกันและ Paul White ให้คำตอบที่น่าสนใจ ตามคำตอบของ Paul สูตรการประมาณค่า cardinality สำหรับ predicates> = และ> (ในกรณีนี้ฉันสนใจเฉพาะรุ่นตัวประมาณ Cardinality อย่างน้อย 120) ดังนี้: สำหรับ>: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * (F * (DISTINCT_RANGE_ROWS - 1))) สำหรับ> =: Cardinality = EQ_ROWS + (AVG_RANGE_ROWS * ((F * (DISTINCT_RANGE_ROWS - 1)) + 1)) ฉันทดสอบแอปพลิเคชันของสูตรเหล่านี้ในตาราง[การผลิต]. [TransactionHistory]ตารางของฐานข้อมูลAdventureWorks2014ตามกริยาช่วงโดยใช้คอลัมน์TransactionDateและช่วงวันที่และเวลาระหว่าง …

2
DBP FREEPROCCACHE และ DBCC FREESYSTEMCACHE ('แผนการ SQL') ไม่ทำอะไรเลยเพื่อเพิ่มหน่วยความจำ CACHESTORE_SQLCP ฟรี
CACHESTORE_SQLCP Sql Plans ใช้เวลา> 38 GB หลังจากสองสามวัน เรากำลังใช้งานตัวเลือก "เพิ่มประสิทธิภาพสำหรับภาระงาน Ad hoc" (Entity Framework และการรายงานที่กำหนดเองสร้างโฆษณาจำนวนมาก!) SQL Server 2016 SE 3.00.2164.0.v1 บน AWS RDS พร้อมการจำลองแบบหลาย AZ เมื่อฉันวิ่ง: DBCC FREESYSTEMCACHE('SQL Plans'); หรือ DBCC FREEPROCCACHE หรือ DBCC FREESYSTEMCACHE ('SQL Plans') WITH MARK_IN_USE_FOR_REMOVAL หรือ DBCC FREESYSTEMCACHE ('ALL') WITH MARK_IN_USE_FOR_REMOVAL; ดูเหมือนจะไม่ชัดเจนว่า: SELECT TOP 1 type, name, …

1
การเปลี่ยนแปลงค่าประมาณของเพรดิเคตที่มี SUBSTRING () ใน SQL Server 2016 หรือไม่
มีเอกสารหรืองานวิจัยใดเกี่ยวกับการเปลี่ยนแปลงใน SQL Server 2016 ถึงความคาดการณ์ของ cardinality สำหรับเพรดิเคตที่มี SUBSTRING () หรือฟังก์ชันสตริงอื่น ๆ หรือไม่? เหตุผลที่ฉันถามคือฉันกำลังดูคิวรีที่ประสิทธิภาพลดลงในโหมดความเข้ากันได้ 130 และสาเหตุที่เกี่ยวข้องกับการเปลี่ยนแปลงในการประมาณจำนวนแถวที่ตรงกับส่วนคำสั่ง WHERE ที่มีการเรียกไปยัง SUBSTRING () ฉันแก้ไขปัญหาด้วยการเขียนแบบสอบถามใหม่ แต่สงสัยว่าถ้าใครรู้เรื่องเอกสารเกี่ยวกับการเปลี่ยนแปลงในพื้นที่นี้ใน SQL Server 2016 รหัสการสาธิตอยู่ด้านล่าง ค่าประมาณใกล้เคียงกันมากในกรณีทดสอบนี้ แต่ความแม่นยำนั้นขึ้นอยู่กับข้อมูล ในกรณีทดสอบในระดับที่เข้ากันได้ 120, SQL Server ดูเหมือนจะใช้ฮิสโตแกรมสำหรับการประมาณการในขณะที่ในระดับที่เข้ากันได้ 130 SQL Server ดูเหมือนจะสมมติว่า 10% คงที่ของตารางที่ตรงกัน CREATE DATABASE MyStringTestDB; GO USE MyStringTestDB; GO DROP TABLE IF EXISTS dbo.StringTest; …

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.